线程使用总结:创建线程的三种方法
程序员文章站
2022-07-10 17:30:29
继承Thread类:子类继承Thread类具备多线程能力启动线程:子类对象.start()不建议使用:避免OOP单继承局限性public class ThreadDemo2 extends Thread { @Override public void run() { for (int i = 0; i < 1000; i++) { System.out.println(Thread.currentThread().getName()....
继承Thread类:
- 子类继承Thread类具备多线程能力
- 启动线程:子类对象.start()
- 不建议使用:避免OOP单继承局限性
public class ThreadDemo2 extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(Thread.currentThread().getName() + "我在吃饭" + i);
}
}
public static void main(String[] args) {
ThreadDemo2 threadDemo = new ThreadDemo2();
threadDemo.setName("耿爽");
threadDemo.start();
for (int i = 0; i < 1000; i++) {
System.out.println("我在学习多线程" + i);
}
}
}
输出结果为:
注意:线程开启,并不一定立刻执行,由cpu调度执行
实现Runnable接口:
- 实现接口Runnable具有多线程能力
- 启动线程:传入目标对象+Thread对象.start()
- 推荐使用:避免单继承局限性,灵活方便,方便同一个对象被多个线程使用。
public class ThreadDemo implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "我在吃饭" + i);
}
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println("我在学习多线程");
Runnable runnable = new ThreadDemo();
Thread thread = new Thread(runnable, "耿爽");
thread.start();
}
}
}
其实不管是通过继承Thread类还是通过实现Runable接口来实现线程,最终都是通过Thread类的对象的API来控制线程(代理设计模式)。
源码:
Thread类本质上也是实现了Runnable接口,启动线程的唯一方法就是通过Thread类的start()方法。start()方法是一个native(本地)方法,它将启动一个新线程,并执行run()方法(Thread类中提供的run()方法是一个空方法)。
实现Callable接口
Runnable和Callable的区别
- Callable规定的方法是 call(), Runnable规定的方法是 run()。
- Callable的任务执行后可返回值,而 Runnable的任务是不能返回值。
- call方法可以抛出异常, run方法不可以。
- 运行 Callable任务可以拿到一个 Future对象
- 在实现接口时,Callable后又对尖括号中间还有个T,如:,这就是泛型,里面尖括号填写你的返回值的类型:
public class ThreadDemo3 implements Callable<Integer> {
private int i;
@Override
public Integer call() throws Exception {
for (; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + "我在吃饭" + i);
}
return i;
}
public static void main(String[] args) {
Callable<Integer> callable = new ThreadDemo3();
FutureTask<Integer> futureTask = new FutureTask<>(callable);
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+"我在学习多线程"+i);
Thread thread = new Thread(futureTask, "耿爽");
thread.start();
}
}
}
实现结果为:
本文地址:https://blog.csdn.net/weixin_45371171/article/details/110247238
上一篇: 贵州的特产小吃
下一篇: 算法二叉树-二叉树的最小深度(递归法)