11.多线程

在任何一种开发语言中,多线程处理都是一种比较复杂的处理方式,需要掌握好多知识点,才能开发一个完整的多线程应用。
在开发多线程时,需要注意的事项包括以下:
1、线程隔离,各个线程之间的数据是相互不影响的,没有先后顺序。
2、资源获取同步,比如售票,不能多个线程同时售同一张票。
3、多线程结束确认,必须得清楚何时多线程全部执行完。
下面简单介绍一个java原生多线程实现方式。

DealResource.java,多线程里面单个线程作为资源来进行处理
public class DealResource { private int ticketCount; //定义车票张数 boolean flag = false; // 定义车票是否处理完 List listTickets; // 定义所有车票 private static Object lock = new Object(); // 定义锁,分配数据时不同步,处理数据时同步public DealResource(int ticketCount,List listTickets) { this.ticketCount = ticketCount; this.listTickets = listTickets; }/** * synchronized线程安全 */ public void doIni(MultiThread multiThread) { String ticket = null; //定义该线程要处理的车票 synchronized (lock) { if (ticketCount > 0) { ticket = listTickets.get(ticketCount - 1); ticketCount--; } else { flag = true; } }if (ticket != null) { if (!flag) { System.out.println("已卖" + ticket); } } } }

这个类里面有几个核心的点需要理解:
1、 boolean flag 这个参数用于定义车票是否售完,售完的话即停止继续售票
2、private static Object lock = new Object(); // 定义锁,分配数据时不同步,处理数据时同步,synchronized (lock)这个可以保证分配资源时是同步的。
3、System.out.println("已卖" + ticket); 这一块是具体卖票的处理过程
synchronized (lock) { if (ticketCount > 0) { ticket = listTickets.get(ticketCount - 1); ticketCount--; } else { flag = true; } }

这段代码就是当售完一张票,ticketCount减一,直到为0
MultiThread.java 这个类负责资源传递,一般在开发中,这个类基本是不变的
public class MultiThread implements Runnable { DealResource dealResource; // 定义车票资源public MultiThread(DealResource dealResource) { this.dealResource = dealResource; }public final void run() { while (!dealResource.flag) { /** * 调用资源类的同步方法 */ dealResource.doIni(this); } } }

TestMultiThread .java,测试多线程
public class TestMultiThread {/** * 生产车票 * * @return */ public List createTickets() { List list = new ArrayList<>(); for (int i = 0; i < 100; i++) { list.add("车票" + i); } return list; }public void sellTicket() { List listTicket = createTickets(); DealResource dealResource = new DealResource(listTicket.size(), listTicket); Vector threads = new Vector(); int threadNum = 10; // 定义线程数量 for (int i = 0; i < threadNum; i++) { Thread iThread = new Thread(new MultiThread(dealResource)); threads.add(iThread); iThread.start(); }for (Thread iThread : threads) { try { // 等待所有线程执行完毕 iThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } }public static void main(String[] args) { TestMultiThread testMultiThread = new TestMultiThread(); testMultiThread.sellTicket(); } }

createTickets()这个方法是生成要售的车票, 放到list里面
sellTicket()这个是具体售票的处理过程,先定义DealResource,把共有多少票,及车票的list放进去。Vector threads = new Vector(); ,定义一个vector的thread容器。
Thread iThread = new Thread(new MultiThread(dealResource)); threads.add(iThread); iThread.start();

这三句话是处理多线程的。
最后一段代码里面的 iThread.join(); 是判断线程是否执行结束。
整体执行:

11.多线程
文章图片
多线程处理 按照这种模式开发多线程,主要步骤如下:
1、定义DealResource类,主要参数都差不多。
2、定义multiThread类,基本不用怎么动,目的是调用DealResource类
3、定义具体的多线程启动方法,按照给的例子一步一步复制粘贴即可。
源码下载 【11.多线程】本工程详细源码

    推荐阅读