Java线程的启动有三种方式,本文通过比较,对Java线程的启动方式和线程特点做个总结!
1.继承Thread类创建线程
这种方式一般需要重写父类run方法,然后调用start()启动线程,实例如下
public class Thread1 extends Thread{
public void run() {
System.out.println("I am thread1");
}
}
2.实现Runnable接口创建线程
public class Thread2 implements Runnable {
@Override
public void run() {
System.out.println("I am thread2");
}
}
3.实现Callable接口创建线程
public class Thread3 implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("I am thread3");
return "hello world";
}
}
4.三种方式的启动测试
public class ThreadStartTest {
@Test
public void threadTest() throws Exception{
Thread1 thread1 = new Thread1();
thread1.start();//线程1启动
Runnable runnable = new Thread2();
// Runnable实现类必须显式地将一个任务附着到线程上
Thread runnableThread = new Thread(runnable);
runnableThread.start();//线程2启动
Callable<String> callable = new Thread3();
FutureTask<String> futureTask = new FutureTask<String>(callable);
Thread callableThread = new Thread(futureTask);
callableThread.start();//线程3启动
//获得call()方法返回值
System.out.println(futureTask.get());
}
}
运行结果如下图所示:
5.三种启动方式的比较
(1)通过继承Thread类来创建线程实现较为简单,但是由于Java的单继承原则,不能再继承其他的类,程序的可扩展性受到很大限制。而且从面向接口编程的角度来讲,更提倡通过实现Runnable或Callable接口来创建线程。
(2)Runnable 和Callable的区别
Callable的call()方法可以有返回值,也可以抛出异常,而Callable的run()方法则不能。对需要线程执行结果的场景使用Callable更合适
6.Java线程的状态
7.线程优先级注意事项
Java线程的优先级用整数1到10表示,数值越大优先级越高,但是优先级高的并不意味着一定会优先执行,只是几率更大而已。实际编程时在逻辑上不要依赖Java线程的优先级,不靠谱。此外Java的优先级依赖于操作系统,不同的操作系统有不同的线程优先级的取值范围,而Java的优先级只能从1到10,这就有可能出现某几个定义不同的优先级线程在有的系统里却对应着同一个优先级的重叠情况。总之不要依赖优先级!