Thread

作者: 霍霍9527 | 来源:发表于2020-06-07 15:17 被阅读0次

    线程机制理解
    开启线程: Thread thread = new Thread(Runnable).start();
    thread.stop()方法是直接停止线程,这个方法已被启用,由于线程是开发者自己开启的,里面的内容也是开发者写的,线程最好停止的方式是线程自己控制,现在外部线程控制另一个线程的死亡是不安全的,停止线程很有用,但是也很没用.

    thread.interrutp(),现在提供这种方式停止线程,其本质是向目标线程发起一个中断标记,目标线程获取这个中断标记可以自己控制(开发者控制)是否关闭,这种 方式就是线程自己处理自己的关闭与否
    中断注意事项,可以通过线程自己的interrupt方法判断是否标记了中断,这个状态是不变的,还有一个是Thread.interrupted()该方法可以用来判断当前线程是否中断,但是他有一个处理,就是判断完之后就把状态给重置了,这个和thread对象的中断有点区别需要注意,还有一点就是Thread.sleep()方法,调用该方法要处理异常try{}catch(InterruptedException),如果是sleep状态的中断的话会执行异常处理并且把状态重置,所有如果要停止线程要在异常处理return,否则线程停止不掉。

    锁的wait() notifyAll()理解

    class TestWait{
       private String sharedString;
      private synchronized void initString(){
            sharedString = "huo";
            notifyAll();
      }
       private synchronized void printString(){
           while(sharedString == null){
                try {  wait(); }catch(InterruptedException e){ e.printStackTrace()}
            }
            System.out.println("String: " + sharedString);
      }
    }
    

    wait会释放锁,当执行打印的时候如果没有初始化,执行锁的wait(),当前持有锁的线程就被挂起放到等待队列,后面的线程也是如此都放入等待队列,当初始化线程执行初始化后通知,所有的等待线程会被唤醒抢锁 执行打印代码。注意:如果printString方法没有执行wait,就会出发死锁,该线程持有锁后就无限while,其他线程获取不到锁,initString也执行不了。还有如果synchronized 去掉的话 上面的代码会报错,去掉后没有锁了,notifyAll、wait找不到所,IllegalMontiorStateException

    thread.join() 在当前线程执行另一个线程的thread.join()方法,会暂停当前线程,指定thread线程,当线程执行完成后在执行当前线程。

    Thrad.yeald(),让出当前线程的时间,给其他线程执行。多个线程竞争执行,让出几个线程呢,这个不确定,不同的操作系统不一样。

    ThreadLocal

    相关文章

      网友评论

          本文标题:Thread

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