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():在保证线程池中有很大一部分线程处于空闲状态,并且空闲状态的线程在小雨某一值时,减少线程池中线程的个数。