Thread类是Java的内置类,可以直接进行调用,我们一般使用直接使用Thread类名直接使用其方法。
线程的创建:
线程的创建有三种方法:1.继承Thread类重写run方法 2.实现Runnable接口重写run方法 3.实现Calllble接口重写call方法。
1.继承Thread类重写run方法
class MyThread extends Thread{
@Override
public void run() {
}
}
2.实现Runnable接口重写run方法
class MyThread implements Runnable{
@Override
public void run() {
}
}
3.实现Calllble接口重写call方法
这时候我们需要注意我们不能直接将这个callable实例直接放入到线程的构造方法中,这时候我们需要对其进行包装,我们使用FutureTask进行包装,将包装后的FutureTask实例才能放入Thread的构造方法中。
Callable<Integer> callable = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
return 0;
}
};
FutureTask<Integer> futureTask = new FutureTask<>(callable);
Thread thread = new Thread(futureTask);
线程的中断:
Thread thread=new Thread(){
@Override
public void run() {
}
};
thread.interrupt();
我们有两种方式可以判断线程是否被中断:
1.Thread.interrupted()
2.Thread.currentThread().isInterrupted()
第一个方法是直接通过Thread调用其类方法。
第二个方法是通过Thread.currentThread获取到该线程实例,然后调用其isInterrupted方法。
当线程调用wait(),sleep(),join()方法处于阻塞状态的时候,收到了中断通知时,会抛出异常,抛出异常之后线程的中断状态会被清除。
当线程没有调用wait(),sleep(),join()方法时,当收到中断通知时,Thread.interrupted()会判断当前线程是否被中断,若中断状态为true,清除当前状态置为false。
而Thread.currentThread().isInterrupted()会判断当前线程是否被中断,若中断状态为true,不会清除当前状态。保持为true;
线程的等待:
我们有时候需要一个线程等待另一个线程的时候,我们就可以使用Object类提供的wait()方法,注意wait()方法需要搭配sychronized进行使用,wait()可以让线程处于等待状态,无法继续执行下面的程序,然后会释放锁资源,然后等待其他线程唤醒,我们通过notify()可以唤醒线程,notify()也需要搭配synchornized。wait方法中可以写入一个参数,这个参数是等待时间,当等待的时候超过时间约束,那就会自动被唤醒,继续执行之后的操作,当我们没有传入参数的时候,这个线程就会死等,如果没有其他线程对其进行唤醒,那这个线程会一直处于等待状态。
线程的休眠:
我们使用Thread类里面的sleep方法可以让线程休眠一段时间,sleep不要配合synchronized进行使用,可以进行单独使用,当我们使用slee方法时需要传入一个时间参数。当休眠时间大于这个时间的时候,这个线程会继续之后的操作。