• 多线程


    1.实现的方式有两种实现Runnable 和继承Thread

        线程中的关键方法:

    (1)  //volatile保证了线程可以正确的读取其他线程写入的值
       //可见性的问题 参考refjMM
     
    一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
    精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
     
     
     (2)  // 让出处理时间,下一次该谁攻击还不一定呢;保证线程同步
                    Thread.yield();
    Thread.yield();,表示暂停当前线程,执行其他线程(包括自身线程) 由cpu决定
     
     
    (3)通过Runnable中的Thread.currentThread()获取当前线程的信息;
       Thread.currentThread().getName()
     
    (4)runnable线程启动的步骤
     vThreadArmy armyTask = new ThreadArmy();
            Thread armyThread = new Thread(armyTask, "随军");
            // 启动线程让军队开始作战
            armyThread.start();
     
     
    (5)farmerThread.join();
        所有线程等待当前线程结束之后在执行其他线程,让当前线程完成自己的任务
     

    一、.join()使用方式。

    join是Thread类的一个方法,启动线程后直接调用,例如:

    Thread t = new AThread(); t.start(); t.join();

    二、为什么要用join()方法

    在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,

    需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再结束,这个时候就要用到join()方法了。

    三、join方法的作用

    在JDk的API里对于join()方法是:

    join

    public final void join() throws InterruptedException Waits for this thread to die. Throws: InterruptedException  - if any thread has interrupted the current thread. The interrupted status of the current thread is cleared when this exception is thrown.

    即join()的作用是:“等待该线程终止”,这里需要理解的就是该线程是指的主线程等待子线程的终止。也就是在子线程调用了join()方法后面的代码,只有等到子线程结束了才能执行。

       注:错误的停止方法stop;

      正确的停止方法:使用线程中volatile boolean keepRunning = true;的属性,设置为false;

       线程同步锁:

     synchronized(lockObj){
                
    //             if (energyBoxes[from] < amount)
    //                 return;
                //while循环,保证条件不满足时任务都会被条件阻挡
                 //而不是继续竞争CPU资源
                 while (energyBoxes[from] < amount){
                     try {
                        //条件不满足, 将当前线程放入Wait Set
                        lockObj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                 }
                
                
                 System.out.print(Thread.currentThread().getName());
                 energyBoxes[from] -= amount;
                 System.out.printf("从%d转移%10.2f单位能量到%d", from, amount, to);
                 energyBoxes[to] += amount;
                 System.out.printf(" 能量总和:%10.2f%n", getTotalEnergies());
                //唤醒所有在lockObj对象上等待的线程
                 lockObj.notifyAll();
             }

  • 相关阅读:
    Construct Binary Tree From Inorder and Postorder Traversal
    Construct Binary Tree From Preorder and Inorder Traversal **
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
    Flatten Binary Tree to Linked List
    E1总结和CISCO E1配置
    Dial-peer匹配顺序
    CUCM来实现PLAR
    CUCM实现Extension Mobility
    语音笔记20 URI
  • 原文地址:https://www.cnblogs.com/huihuizhang/p/5829931.html
Copyright © 2020-2023  润新知