欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

创建线程的三种方式

时间:2023-06-14
1.继承Thread类

public class MyThread extends Thread{ @Override public void run() { for(int i=0;i<10;i++){ System.out.println("锄禾日当午"+i); } }}

public static void main(String[] args){MyThread m=new MyThread(); m.start();}

2.实现Runnable接口

public class MyRunable implements Runnable{ @Override public void run() { for (int i=0;i<10;i++){ System.out.println("一二三四五"+i); } }}

public static void main(String[] args){MyRunable myRunable=new MyRunable(); Thread t=new Thread(myRunable); t.start();}

3.实现Callable接口

package fangfa1;import java.util.concurrent.Callable;import java.util.concurrent.FutureTask;public class Demo5 { public static void main(String[] args) { Call call = new Call(); FutureTask futureTask=new FutureTask<>(call); new Thread(futureTask).start(); for(int i=0;i<100;i++){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i); } } static class Call implements Callable { @Override public Integer call() throws Exception { for(int i=0;i<100;i++){ Thread.sleep(1000); System.out.println(i); } return 100; } }}

注意:面试时会问到第三种创建方式(但是平常极少用)

Runnable与Callable的相同点

(1)都是接口

(2)都可以编写多线程程序

(3)都采用Thread.start()启动线程

Runnable与Callable的不同点

(1)Ruunnable没有返回值,Callable可以返回执行结果(需要调用FutureTask.get()得到,此方法会阻塞主进程的继续往下执行,如果不调用不会阻塞)

(2)Callbale中的call()允许抛出异常,Runnable中的run()不允许

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。