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
注意:面试时会问到第三种创建方式(但是平常极少用)
Runnable与Callable的相同点
(1)都是接口
(2)都可以编写多线程程序
(3)都采用Thread.start()启动线程
Runnable与Callable的不同点
(1)Ruunnable没有返回值,Callable可以返回执行结果(需要调用FutureTask.get()得到,此方法会阻塞主进程的继续往下执行,如果不调用不会阻塞)
(2)Callbale中的call()允许抛出异常,Runnable中的run()不允许