Java 线程Thread

2021-07-27  本文已影响0人  薛定谔的猫QAQ

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() 唤起所有在等待的线程

上一篇下一篇

猜你喜欢

热点阅读