zoukankan      html  css  js  c++  java
  • JAVA并行程序基础一

    JAVA并行程序基础一

    线程的状态

    初始线程:线程的基本操作

    1. 新建线程

    新建线程只需要使用new关键字创建一个线程对象,并且用start() ,线程start()之后会执行run()方法

    不要直接调用run()方法,它只会在当前线程串行执行run()中的方法。

    重载run()方法有两种方式

    1. 直接继承Thread类
    2. 实现Runnable接口 它只有一个run()方法 在new Thread()时将接口实现类传入

    2.终止线程

    一般线程在执行完毕就会结束,无需手动关闭。但java也提供手动关闭的方法。

    终止线程 JDK中有一个stop()方法。stop()方法被标注是一个遗弃的方法,因为直接执行stop方法会直接终止进程,并且立即释放这个线程所持有的锁。这会引起一些数据不一致问题。

    对于自己写的一些无穷循环的线程可以自己做标记实现退出循环,进而由java虚拟机寻找合适的机会结束进程。

    3.线程中断

    直接执行stop()会引起严重的问题。JDK提供了另一种支持线程中断

    线程中断不会是线程立即退出。而是给线程发一个通知,告知目标线程有人希望退出 之后的操作由目标自行决定

    public void interrupt();//中断线程
    public boolean isInterrupted() ;//判断线程是否中断
    public static boolean interrupted() ;//判断线程是否中断,并清除当前中断状态
    

    如果线程处于休眠状态,执行中断操作则会报出中断异常。

     Thread thread = new Thread(() -> {
                while (true) {
    
                    if (Thread.currentThread().isInterrupted()) {
                        System.out.println(Thread.currentThread().getName() + "线程退出");
                        break;
                    }
                    System.out.println(Thread.currentThread().getName() + "线程执行");
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        System.out.println(Thread.currentThread().getName() + "线程睡眠");
                        Thread.currentThread().interrupt();
                    }
                }
            });
            thread.start();
            thread.interrupt();
    

    使用中断线程的方式退出线程 这种方式更强劲,可以处理wait(),sleep()操作,由于Thread.sleep()方法由于中断而抛异常,此时,它会清除中断的标记 。那么在下次循环就没有中断标记了,所以在catch字句中再次设置中断标记位。

    4.等待(wait)与通知(notify)

    wait()和notify()是支持线程之间协作的 一个对象在某个线程内调用wait()方法后此线程就会进入等待状态,自动释放当前线程所拿到的所有的锁。直到其他线程此对象执行notify()方法为止。

    final static Object obj=new Object();
        public static void main(String[] args) {
            Thread Thread1=new Thread(()->{
               synchronized (obj){
                   System.out.println(Thread.currentThread().getName()+"开始执行");
                   try {
                       System.out.println(Thread.currentThread().getName()+"开始等待");
                       obj.wait();
                       System.out.println(Thread.currentThread().getName()+"收到通知停止等待");
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
    
            });
    
            Thread thread2=new Thread(()->{
                synchronized (obj){
    
                    System.out.println(Thread.currentThread().getName()+"发送通知");
                    obj.notify();
                    System.out.println(Thread.currentThread().getName()+"通知完毕");
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"休眠完毕");
                }
            });
    
            Thread1.start();
            thread2.start();
    
        }
    

    5.挂起(suspend)与继续执行(resume)线程

    当一个线程执行了suspend()之后会立即停止执行直到 执行resume()后会重新执行。看起来很方便但这两个方法也是过时方法。不推荐使用。因为当线程执行suspend()不会释放任何锁资源,可能会导致系统无法正常运行。比较靠谱的是利用wait()和notify()方法来控制线程的暂停可运行

    6.等待线程(join)和谦让(yield)

    线程之间和协作如同人与人之间的合作,有时完成一件事需要另一件事先完成。在a线程执行b.join()就是线程a等待b执行完毕再继续执行

    Thread.yield()方法执行后当前线程会让出CPU,重新与其他线程一起再次竞争执行权

  • 相关阅读:
    select2 下拉搜索 可编辑可搜索 / 只可搜索
    获取服务器时间ajax
    table中td 内容超长 自动折行 (含字母数字文字)
    下拉菜单 ,三级联动 ,夹其它下拉菜单
    echarts 添加标线,设置颜色
    table 中的tr 行点击 变换颜色背景
    checkebox 全选 ,子复选框单个全部选择后,全选框也会被选择
    replace替换,全局和局部替换
    字断行
    ydoc 参考系列
  • 原文地址:https://www.cnblogs.com/huangshen/p/13224980.html
Copyright © 2011-2022 走看看