Thread类:
Thread类实现了Runnable接口,所以Thread类对象也是Runnable对象
Thread() //一般用于在Thread类中覆盖定义run方法,可以使用匿名内部类的方式进行定义
Thread(Runnable) //使用最多的情形,run方法是通过Runnable对象提供的
Thread(String) //创建线程对象的同时设置线程名称
Thread(Runnable,String)
//常见的简化写法
Thread t=new Thread(()->{
System.out.println(Thread.currentThread());
});
t.start();
方法 说明 void start() 使该线程对象开始执行,处于就绪状态,注意不是立即执行
JVM调用的是该线程对象的run方法
void run()
线程的执行体,其中是当前线程的具体处理逻辑 void setName(String) 改变该线程对象的名称 void setPriority(int) 更改该线程对象的优先级,Java中线程的优先级可以分为1-10整数,默认为5。优先级越高则获取更多的运行机会 void setDaemon(boolean) 设置该线程对象为守护线程,一般守护线程中使用的都是死循环,在所有的非守护线程退出后自动关闭 void join()/join(long) 等待该线程对象终止,调用的当前线程会阻塞等待,如果有参数long则表示最多等待long毫秒 void interrupt() 中断该线程,不是中断线程的执行,而是修改中断参数 boolean isActive() 判断该线程对象是否处于活跃状态。活跃状态是指线程已经启动但是还没有终止 static void yield() 暂停正在执行的线程对象,并执行其它线程。具体执行哪个线程取决于系统的线程调度机制,也可有可能该线程对象再次运行 static void sleep(long) 在指定的long毫秒数的时间内使当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响 static Thread currrentThread() 返回当前正在执行的线程对象的引用
Runnable接口:
Runnable接口中只定义了一个方法public void run(),Runnable对象一般称为可运行对象,而一个线程对象运行的就是Runnable对象中的run方法
注意:run方法没有返回值,而且不能抛出异常
代码实现:
public class Test01 {
static class MyRunnable implements Runnable{
public void run(){
}
}
// 简化写法
new Thread(()->{
for (int i = 0; i < 100; i++) {
System.out.println("左");
try {
Thread.sleep(100); // 这里有一个受检型异常,因为run不允许抛出异常,所以必须使用try/catch进行处理
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
Callable接口:
继承Thread类或者实现Runnable接口都有一个缺陷:在执行完成后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量的方式来实现,这样使用非常的麻烦。引入Callable接口的目的就是获取执行结果
Thread和Runnable都在java.lang包中,而Callable是在juc包java.util.concurrent
Callable接口中有一个方法call,call方法要求有返回值,这个返回值可以通过泛型进行约束,并且允许抛出异常
代码实现:
public class MyCallable implements Callable<Number> {
public Number call() throws Exception{
return 100; --- int
return 100.0; --- double
} // call方法的返回值类型要和Callable接口后面<>中的类型一致。数值型的包装类的父类型就是Number}
//简化写法
new Thread(new FutureTask<>(()->{
for (
int i = 0; i < 10; i++) {
System.out.println("右手画彩虹");
Thread.sleep(30);// 允许抛出异常
}
return 10; // 必须有返回值
})).start();
Future接口:
Future接口对象用于表示一个任务的生命周期,提供了一组方法用于判断是否已经完成或者取消,以及获取任务的执行结果或取消任务。必要时可以通过get()方法获取线程的执行结果,该方法可以阻塞当前线程直到任务结束为止或者超时
cancel方法:用于取消任务。如果取消成功则返回true,否则false。
isCancelled方法:用于获取任务是否被成功取消。任务正常完成前被取消则返回true
isDone方法:表示任务是否已经完成,如果已经完成返回true
get():获取执行结果,这个方法会产生阻塞,直到任务执行完毕才返回
get(long,TimeUnit):获取执行结果,这个方法会阻塞一段时间,直到任务执行完毕或者超过指定时间才返回。如果在指定时间内没有获取到结果则产生超时异常
FutureTask类:
FutureTask实现了两个接口Runnable和Future,所以它既可以作为Runnable被线程执行,也可以作为Future获取Callable的返回值
FutureTask是一个可取消的异步计算,FutureTask实现了Future接口的基本方法,提供了cancel操作,可以查询是否已经完成,并获取最终的计算结果。结果只能在计算完成后获取,get方法具备阻塞等待的功能,一旦计算完成,那么计算就不能再次启动或者取消
代码实现:
Callable<Integer> callable=new MyCallable();
FutureTask<Integer> future=new FutureTask<>(callable);
new Thread(future).start();