zoukankan      html  css  js  c++  java
  • 多线程

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

  • 相关阅读:
    [ Algorithm ] N次方算法 N Square 动态规划解决
    [ Algorithm ] LCS 算法 动态规划解决
    sql server全文索引使用中的小坑
    关于join时显示no join predicate的那点事
    使用scvmm 2012的动态优化管理群集资源
    附加数据库后无法创建发布,error 2812 解决
    浅谈Virtual Machine Manager(SCVMM 2012) cluster 过载状态检测算法
    windows 2012 r2下安装sharepoint 2013错误解决
    sql server 2012 数据引擎任务调度算法解析(下)
    sql server 2012 数据引擎任务调度算法解析(上)
  • 原文地址:https://www.cnblogs.com/huihuizhang/p/5829931.html
Copyright © 2011-2022 走看看