Java实现多线程的方法

Java实现多线程的方法:继承Thread类,实现Runnable接口,实现Callable接口,线程池。

继承Thread类基本思想:

在子类中重新实现父类中的run()方法,然后在使用多线程的时候调用start()方法,则系统会自动调用run()方法。继承Thread类实现的模式是定义多个线程,各自完成各自的任务。

实现Runnable接口实现的模式是定义多个线程,完成同一个任务。

实现Callable接口:通过FutureTask包装器来创建Thread线程。

代码:

继承Thread类:

​
public class MultithreadCreat extends Thread{
public static void main(String args[]){
MultithreadCreat t=new MultithreadCreat();
t.setName("A");
t.start();
MultithreadCreat t1=new MultithreadCreat();
t1.setName("B");
t1.start();
}
@Override
public void run(){
for(int i=0;i<100;i++){
try{
Thread.currentThread().sleep(50);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+i);
}
}
}

​

实现Runnable接口:

public class MultithreadCreat extends Thread{
public static void main(String args[]){
MultithreadCreat r=new MultithreadCreat();
Thread t=new Thread(r);
t.setName("A");
t.start();
MultithreadCreat r1=new MultithreadCreat();
Thread t1=new Thread(r1);
t1.setName("B");
t1.start();
}
@Override
public void run(){
for(int i=0;i<100;i++){
try{
Thread.currentThread().sleep(50);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+i);
}
}
}

线程池:

定义:线程池用于创建多个可执行的线程并存于容器中,需要时可直接从线程池中取出线程,而无需创建,用完后存于线程池中,而无需销毁,从而减少了创建线程与销毁线程所需开销。

线程池的使用条件:假设一个服务器完成任务所需的各段时间如下:

创建线程的时间T1,线程的执行时间T2,线程的销毁时间T3,如果T1+T3所需的时间远远大于T2,则可以采用线程池来提高服务器性能。

线程池的基本组成部分:

线程池管理器,工作线程,任务接口,任务队列。

线程池管理器(ThreadPool):用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务。

工作线程(PoolWorker):线程池中的线程,在没有任务时处于等待状态,可以循环的执行任务。

任务接口(TaskInterface):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完毕后的收尾工作,任务的执行状态等。

任务队列(TaskQueue):用于存放没有处理的任务,提供一种缓冲机制。

常见线程池:

newSingleThreadExecutor:线程池中每次只有一个线程工作,单线程串行执行任务。

newFixedThreadExecutor:固定数量的线程池,每提交一个任务就是一个线程,直到达到线程池的最大数量,然后后面进入等待队列直到前面的任务完成才继续执行。

newCacheThreadExecutor(推荐使用):可缓存线程,当线程池大小超过了处理任务所需的线程,那么就会回收部分空闲(一般是60秒无执行)的线程,当有任务来时,又智能的添加新线程来执行。

newScheduleThreadExecutor:大小无限制的线程,支持定时和周期性的执行线程。

线程池锁包含的方法:

   1) private ThreadPool():创建线程池

   2) public static ThreadPool getThreadPool():获得一个默认线程个数的线程池

   3) public void execute(Runnable task):执行任务,其实只是把任务加入任务队列,什么时候执行由线程池管理器决定。

   4) public void execute(Runnable[] task):批量执行任务,其实只是把任务加入任务队列,什么时候执行由线程池管理器决定。

   5) public void destroy():销毁线程池,该方法保证在所有任务都完成的情况下才销毁所有线程,否则,等待任务完成才销毁。

   6) public void getWorkThreadNumber():返回工作线程的个数。

   7) public int getFinishedTasknumber():返回已完成的个数,这里的已完成是指出了任务队列的任务个数,可能该任务并没有实际执行完成。

   8) public void addThread():在保证线程池中所有线程正在执行,并且要执行的个数大于某一值时,增加线程池中线程的个数。

   9) public void reduceThread():在保证线程池中有很大一部分线程处于空闲状态,并且空闲状态的线程在小雨某一值时,减少线程池中线程的个数。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值