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张图片
多线程处理

按照这种模式开发多线程,主要步骤如下:

1、定义DealResource类,主要参数都差不多。
2、定义multiThread类,基本不用怎么动,目的是调用DealResource类
3、定义具体的多线程启动方法,按照给的例子一步一步复制粘贴即可。

源码下载

本工程详细源码

你可能感兴趣的:(11.多线程)