美文网首页
11.多线程

11.多线程

作者: 孔垂云 | 来源:发表于2017-05-23 00:08 被阅读0次

    在任何一种开发语言中,多线程处理都是一种比较复杂的处理方式,需要掌握好多知识点,才能开发一个完整的多线程应用。

    在开发多线程时,需要注意的事项包括以下:
    1、线程隔离,各个线程之间的数据是相互不影响的,没有先后顺序。
    2、资源获取同步,比如售票,不能多个线程同时售同一张票。
    3、多线程结束确认,必须得清楚何时多线程全部执行完。

    下面简单介绍一个java原生多线程实现方式。

    DealResource.java,多线程里面单个线程作为资源来进行处理

    public class DealResource {
        private int ticketCount;//定义车票张数
        boolean flag = false; // 定义车票是否处理完
        List<String> listTickets;// 定义所有车票
        private static Object lock = new Object();// 定义锁,分配数据时不同步,处理数据时同步
    
        public DealResource(int ticketCount,List<String> 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<String> createTickets() {
            List<String> list = new ArrayList<>();
            for (int i = 0; i < 100; i++) {
                list.add("车票" + i);
            }
            return list;
        }
    
        public void sellTicket() {
            List<String> listTicket = createTickets();
            DealResource dealResource = new DealResource(listTicket.size(), listTicket);
            Vector<Thread> threads = new Vector<Thread>();
            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<Thread> threads = new Vector<Thread>();,定义一个vector的thread容器。

       Thread iThread = new Thread(new MultiThread(dealResource));
                threads.add(iThread);
                iThread.start();
    

    这三句话是处理多线程的。

    最后一段代码里面的 iThread.join();是判断线程是否执行结束。

    整体执行:


    多线程处理

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

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

    源码下载

    本工程详细源码

    相关文章

      网友评论

          本文标题:11.多线程

          本文链接:https://www.haomeiwen.com/subject/qjifzttx.html