一、四种方式如下:
(1)继承Thread类创建线程类( 默认包 java.lang.Thread)
(2)实现Runnable接口 (默认包 java.lang.Runnable )
(3)使用Callable和FutureTask创建线程 (包 java.util.concurrent.Callable和java.util.concurrent.FutureTask)
(4)使用线程池ExecutorService (包 java.util.concurrent.ExecutorService)
二、四种方式对比
(1)继承Thread类,不能继承其他类,但是编写简单。
(2)Callable和Runnable为接口,还可以继承其他类,多个线程可以共享一个target
(3)使用线程池可以很好地提高性能,尤其是当程序中需要创建大量生存期很短暂的线程时;同时线程池可以有效地控制并发线程的数量,尤其当系统中包含大量并发线程时,会导致系统性能下降,甚至导致JVM崩溃。
三、具体的代码实现
package com.threetop.www;
/**
* 实现线程的第一种方式 :继承Thread类
* @author wjgs
*
*/
public class Thread01 extends Thread{
int i=0;
//重写run方法
@Override
public void run()
{
System.out.println("继承Thread类开启线程"+i);
}
}
package com.threetop.www;
/**
* 实现线程的第二种方式:实现runnable 接口
* @author wjgs
*
*/
public class Thread02 implements Runnable {
int i=0;
//重写run方法
@Override
public void run()
{
System.out.println("实现runnable接口开启的线程"+i);
}
}
package com.threetop.www;
import java.util.concurrent.*;
/**
* 实现线程的第三种方式:实现callable接口
* @author wjgs
*
*/
public class Thread03 implements Callable<Integer>{
int i=0;
//重写call方法
@Override
public Integer call()
{
System.out.println("实现callable接口开启线程"+i);
return 0;
}
}
四、Main类测试
package com.threetop.www;
import java.util.concurrent.*;
/**
* 测试线程的开启方式
* @author wjgs
*
*/
public class Main {
public static void main(String[]args)
{
int i=0;
while(i<100)
{
//方式一 继承Thread类
Thread01 t1i=new Thread01();
t1i.i=i;
t1i.start();
//方式二 实现Runnable接口
Thread02 t2=new Thread02();
t2.i=i;
Thread t2i=new Thread(t2);
t2i.start();
//方式三 实现Callable接口
Thread03 t3=new Thread03();
t3.i=i;
FutureTask<Integer>f=new FutureTask<Integer>(t3);
Thread t3i=new Thread(f);
t3i.start();
i++;
}
System.out.println();
//方式四: 运用线程池的方式
int taskSize=3;
ExecutorService pool=Executors.newFixedThreadPool(taskSize);
//创建有多个返回值的任务
for(int j=0;j<taskSize;j++)
{
pool.submit(new Thread02()); //实现Runnable
pool.submit(new Thread03()); //实现Callable
}
//关闭线程池
pool.shutdown();
}
}