1.继承方式
用Test类继承与Thread类,重写run方法
public class Test extends Thread{//继承Thread类
public void run(){
//重写run的方法体
}
public static void main(String[] ages){
Test t1=new Test(); //实例化一个线程对象
Test t2=new Test();
t1.start()//启动线程
t2.start()//启动线程
}
}
这个方式不能实现资源的共享,因为一个线程启动后只会运行一个独立的任务,因为任务绑定在了一个独立类里
2.实现Runnable接口方式
public class Test implements Runnable{//实现Runnable接口
public void run(){
//注意这里,上面说是重写,这里是实现
}
public void static main(String[] ages){
Test t=new Test();//实例化一个类
Thread thread1=new Thread(t);//将这个实例绑定到一个线程上
Thread thread2=new Thread(t);
Thread thread3=new Thread(t);
thread1.start();//线程启动
thread2.start();
thread3.start();
}
}
用接口的方式可以实现资源的共享,因为是将一个任务绑定到多个线程上面
3.实现Callable和Futrue方式实现
这种方式和Runnable接口实现的方式差不多,他实现是call()方法,而不是run()方法
有点区别的地方是 call()可以抛出异常,并且可以有返回值,但是run()不行
因为这两个接口不是在默认包中的,所以我们要导入进来
import java.util.concurrent.Futrue;
import java.util.concurrent.Callabel;
public class Test implements Callable{//实现接口
public Interger call() throws Exception{
//实现call方法
}
public static void main(String[] ages){
Test t=new Test();//创建一个实例
FutrueTask ft=new FutureTask(t);
//以t为参数创建一个FutrueTask对象,这个对象是一个包装器,他是通过Callable来创建的,他实现了Runnable和Futrue接口
//所以说塔克以启动线程
Thread thread=new Thread(ft);//用FutrueTask来创建线程
thread.start();
}
}
这种方式好像也不能实现资源共享,只要知道有那么一种方式实现线程就可以了,以为这个方式比其他方式差
4.通过线程池来创建的方式
引入的包同上
1。定义线程类
class Handler implements Runnable{
}
2。建立ExecutorService线程池
ExecutorService executorService = Executors.newCachedThreadPool();
//或者
//int cpuNums = Runtime.getRuntime().availableProcessors();
//获取当前系统的CPU 数目
//ExecutorService executorService =Executors.newFixedThreadPool(cpuNums * POOL_SIZE);
//ExecutorService通常根据系统资源情况灵活定义线程池大小
3。调用线程池操作
循环操作,成为daemon,把新实例放入Executor池中
while(true){
executorService.execute(new Handler(socket));
// class Handler implements Runnable{
// 或者
// executorService.execute(createTask(i));
//private static Runnable createTask(final int taskID)
}
execute(Runnable对象);方法
//其实就是对Runnable对象调用start()方法
//(当然还有一些其他后台动作,比如队列,优先级,IDLE timeout,active激活等)
5、通过事件分配线程直接使用程序中的原有线程:
使用方法:
直接调用EventQueue类的静态方法invokeLater():
EventQueue.invokeLater(oneRunnable);
注释:调用EventQueue.invokeLater(oneRunnable);会直接执行oneRunnable对象中的run()方法