创建线程三种方式:
(1)直接定义一个类继承线程类Thread,重写run()方法,创建线程对象
调用线程对象的start()方法启动线程。
缺点:线程类已经继承了Thread类无法继承其他类了,功能不能通过继承拓展(单继承的局限性)。
public class ThreadDemo1 { public static void main(String[] args) { Thread t1 = new MyThread("线程1"); t1.start(); Thread t2 = new MyThread("线程2"); t2.start(); for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } } } class MyThread extends Thread{ MyThread(String name){ super(name); } @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } } }
(2)定义一个线程任务类实现Runnable接口,重写run()方法,创建线程任务对象,把
线程任务对象包装成线程对象, 调用线程对象的start()方法启动线程。
public class ThreadDemo2 { public static void main(String[] args) { Runnable target = new MyThread1(); Thread t1 = new Thread(target,"线程1"); t1.start(); Thread t2 = new Thread(target,"线程2"); t2.start(); for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } } } class MyThread1 implements Runnable{ @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+":"+i); } } }
(3)实现Callable接口。
实现Callable接口。
-- 1,定义一个线程任务类实现Callable接口 , 申明线程执行的结果类型。
-- 2,重写线程任务类的call方法,这个方法可以直接返回执行的结果。
-- 3,创建一个Callable的线程任务对象。
-- 4,把Callable的线程任务对象包装成一个未来任务对象。
-- 5.把未来任务对象包装成线程对象。
-- 6.调用线程的start()方法启动线程
public class ThreadDemo3 { public static void main(String[] args) { Callable call = new MyThread3(); FutureTask task = new FutureTask(call); Thread t = new Thread(task); t.start(); try { System.out.println(task.get()); } catch (Exception e) { e.printStackTrace(); } } } class MyThread3 implements Callable{ @Override public Object call() throws Exception { int sum = 0; for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+":"+i); sum+=i; } return sum; } }