强烈推荐一个大神的人工智能的教程:http://www.captainai.net/zhanghan
介绍
线程的创建方式主要有两种,第一,继承Thread类,重写run()方法,第二,实现Runnable接口,重写run()方法,除此之外还有一种实现callable接口,重写call()方法。
继承Thread类
缺点:java语言的特点是支持单继承,所以此种方式,不利于扩展。
/** * 第一步:继承Thread类 * 第二步:重写run方法 * 第三步:new 相应的类对象 * 第四步: 调用该类对象的start()方法 */ public class MyThread extends Thread{ private int count = 5; public synchronized void run(){ count--; System.out.println(this.currentThread().getName() + "count =" + count); } public static void main(String[] args) { // new 相应的类对象 MyThread myThread = new MyThread(); //第一种写法,解开注释尝试 //myThread.start(); //第二种写法 Thread t1 = new Thread(myThread,"t1"); //调用start方法 t1.start(); } }
实现Runnable接口
优点:实现的性质和继承Thread类一样,java可以实现多个接口,这种方式更加的灵活。
/** * 第一步:实现Runnable接口 * 第二步:实现run()方法 * 第三步:创建类对象 * 第四步:类对象调用start()方法 */ public class MyRunnable implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + "实现Runnable方式"); } public static void main(String[] args) { MyRunnable myRunnable = new MyRunnable(); Thread t1 = new Thread(myRunnable,"t1"); t1.start(); } }
实现callable接口
特点:这种方式中,必须和Future结合使用,对比以上两种方式,以上两种方式没有返回值,实现callable接口的方式支持有返回值。
public class MyFuture { public static void main(String[] args) throws ExecutionException, InterruptedException { //第一步:通过Callable接口创建FutureTask对象 FutureTask<String> ft = new FutureTask<String>(new Callable<String>() { //第二步:重写call()方法 @Override public String call() throws Exception { return Thread.currentThread().getName(); } }); //第三步:创建线程t1 Thread t1 = new Thread(ft); //第四步:启动线程 t1.start(); //第五步:通过get()方法获得call()方法的返回值 String result = ft.get(); System.out.println(result); } }
run()和start()启动区别
以上几个例子都是调用线程的start()方法启动的线程,当线程调用start()后,start()方法会去新建一个线程,并让这个线程执行run()方法,若直接调用Thread的run()方法,则不会创建新的线程,导致程序还是串行执行的。因此,推荐使用start()方法启动线程而不是run().例子可以参考:线程中run()和start()的区别_dumengzhen的博客-CSDN博客