美文网首页
Java 线程Thread

Java 线程Thread

作者: 薛定谔的猫QAQ | 来源:发表于2021-07-27 09:40 被阅读0次

    thread线程,单位调度的最小资源;以前是个菜鸟,现在进化成了老菜鸟

    线程的基本使用

    public void test() {
            new Thread().start();
        }
    

    这是启动了一个线程啦
    Thread的构造参数,包含3种:
    分别的写法是

    1. extends Thread
    public void test() {
            new Thread(new UserThread()).start();
        }
    
        private static class UserThread extends Thread{
            @Override
            public void run() {
               // TODO
            }
        }
    
    1. implements Runnable
    public void test() {
            new Thread(new UserRunnable()).start();
        }
    
        private static class UserRunnable implements Runnable{
            @Override
            public void run() {
                // TODO
            }
        }
    
    1. implements Callable
    public void test() {
            FutureTask<String> futureTask = new FutureTask<>(new UserCallable());
            new Thread(futureTask).start();
            try {
                if (futureTask.get() != null) {
                     //获取返回值
                    String result = futureTask.get();
                }
    
            } catch (ExecutionException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 泛型
         * 带返回值的
         */
        private static class UserCallable implements Callable<String> {
            @Override
            public String call() throws Exception {
                // TODO
    
                return "执行完成";
            }
        }
    

    基本就是以上3种写法,划重点大家记住
    extends Thread,在代码中 new Thread(new UserThread()).start();这是属于开启线程,其中:

    1. new Thread().start(),这是属于线程
    2. new UserThread(),因为是继承自Thread,所以也是线程

    implements Runnable 在代码中 new Thread(new UserRunnable).start();这是属于开启线程,其中:

    1. new Thread().start(),这是属于线程
    2. new UserRunnable(),不属于线程

    implements Callable 在代码中 new Thread(new FutureTask()).start();这是属于开启线程,其中:

    1. new Thread().start(),这是属于线程
    2. new FutureTask(),不属于线程

    关于中断线程

    以前中断线程,有Thread.stop(),Thread.destory()等方法,但是细心的人,会发现这些方法已经被弃用了,转而提醒大家使用 .interrupted()方法
    两者的区别是:

    1. stop 和 destory 都属于是抢占式,的确会中断线程,但是JDK不建议使用
    2. interrupted属于协作式,就相当于和线程打了个招呼,但是不一定会中断线程,但是会改变isInterrupted()的值,还有注意的是,interrupted有2种调用方式,一种是Thread.interrupted(),静态方法;一种的成员方法,Thread a =new Thread(); a.interrupted(),这两种方法,主要针对的是,isInterrupted的值是否改变了。

    线程间的协作

    线程间的协作,我们需要了解,wait(),notify()和notifyAll(),这些并不是线程所独有的方法,而是Object所持有的方法。
    wait() 也就是让当前线程处于一个等待的状态,需要被唤醒
    notity() 就是唤醒某一个线程,也就是当有多个线程在等待的时候,notify() 这个方法是不可预知的,不知道会唤起哪一个
    notifyAll() 唤起所有在等待的线程

    相关文章

      网友评论

          本文标题:Java 线程Thread

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