几种方法实现线程

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()方法

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值