thread线程,单位调度的最小资源;以前是个菜鸟,现在进化成了老菜鸟
线程的基本使用
public void test() {
new Thread().start();
}
这是启动了一个线程啦
Thread的构造参数,包含3种:
分别的写法是
- extends Thread
public void test() {
new Thread(new UserThread()).start();
}
private static class UserThread extends Thread{
@Override
public void run() {
// TODO
}
}
- implements Runnable
public void test() {
new Thread(new UserRunnable()).start();
}
private static class UserRunnable implements Runnable{
@Override
public void run() {
// TODO
}
}
- 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();这是属于开启线程,其中:
- new Thread().start(),这是属于线程
- new UserThread(),因为是继承自Thread,所以也是线程
implements Runnable 在代码中 new Thread(new UserRunnable).start();这是属于开启线程,其中:
- new Thread().start(),这是属于线程
- new UserRunnable(),不属于线程
implements Callable 在代码中 new Thread(new FutureTask()).start();这是属于开启线程,其中:
- new Thread().start(),这是属于线程
- new FutureTask(),不属于线程
关于中断线程
以前中断线程,有Thread.stop(),Thread.destory()等方法,但是细心的人,会发现这些方法已经被弃用了,转而提醒大家使用 .interrupted()方法
两者的区别是:
- stop 和 destory 都属于是抢占式,的确会中断线程,但是JDK不建议使用
- interrupted属于协作式,就相当于和线程打了个招呼,但是不一定会中断线程,但是会改变isInterrupted()的值,还有注意的是,interrupted有2种调用方式,一种是Thread.interrupted(),静态方法;一种的成员方法,Thread a =new Thread(); a.interrupted(),这两种方法,主要针对的是,isInterrupted的值是否改变了。
线程间的协作
线程间的协作,我们需要了解,wait(),notify()和notifyAll(),这些并不是线程所独有的方法,而是Object所持有的方法。
wait() 也就是让当前线程处于一个等待的状态,需要被唤醒
notity() 就是唤醒某一个线程,也就是当有多个线程在等待的时候,notify() 这个方法是不可预知的,不知道会唤起哪一个
notifyAll() 唤起所有在等待的线程