多线程

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();
         }

原文地址:https://www.cnblogs.com/huihuizhang/p/5829931.html