Java 如何实现并发?
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口
Thread类
Thread类实现了Runnable接口,Thread类中有这么几个重要的方法:
1.run()这个方法是Thread实现了Runnable接口中的抽象方法,是用来实现并发逻辑,开启后run()中的逻辑将会并发执行。
2.start()这个方法是用来开启该对象中run()实现的并发逻辑。
同时Thread类中重载了不同参数的构造方法。
1.无参构造,配合继承Thread的类使用。
2.带有一个Runnable接口参数的构造方法,配合实现Runnable接口的类使用。
public class Threads extends Thread{
public void run(){
//并发逻辑
}
public static void main(String[] args){
Thread th = new Threads();
th.start();//并发开启
}
}
public class Threads implements Runnable{
public void run(){
//并发逻辑
}
public static void main(String[] args){
Thread th = new Thread(new Threads);
th.start();//并发开启
}
}
Callable接口
如果想要并发任务完成后,返回一个返回值,需要实现Callable接口。
该接口只有一个抽象方法:call(),这个方法等同于Runnable接口中的run(),只是多了一个返回值。
这个接口具有泛型参数,实现接口时,确定好返回值的类型。
public class Threads extends Callable<String>{
public String call(){
//并发逻辑
return String;
}
}
Executor(执行器)
Executor 是一个接口 他只有一个抽象方法 void execute(Runnable) 这个方法需要一个Runnable类型的对象。
ExecutorService 也是一个接口,他继承了Executor接口,扩充了Executor接口的功能。
ThreadPoolExecutor 是一个类,他继承了实现ExecutorService接口的抽象类,实现了ExecutorService接口的功能,他有几个重要的方法:
1. execute(Runnable),和Thread类中start()一样,开启一个线程执行这个Runnable对象中run()中的任务。
2.submit(Callable),这个方法是Callable对象开启线程的方法,这个方法具有返回值,他返回的是一个Future对象。
ThreadPoolExecutor 不能直接创建对象,需要使用Executors的静态方法创建对象。
1.Executors.newCachedThreadPool()
2.Executors.newFixedThreadPool(int)
3.Executors.newSingleThreadExecutor()
这三种方法都可以创建ThreadPoolExecutor对象,但是他们之间有区别。
第一种是建立一个带有缓冲功能的线程池,不会限定线程池里面线程的个数,在只有少量线程的时候,开销很少,
第二种是建立一个固定大小的线程池,会先创建线程,当任务数量大于这个线程池的线程数是,多余的任务会等待,等到有空余的线程之后,在执行。
第三种是建立一个只有一条线程的线程池。
关于线程优先级
线程的优先级对于线程执行来讲,并不是特别重要,这和具体的jvm实现有关。
currentThread()获取当前线程对象
getPriority()得到现在这个线程的优先级
setPriority()修改这个线程的优先级
在主线程中创建的线程的优先级默认和主线程一致。
关于后台线程和用户线程
后台线程是指在程序运行的时候在后台提供一种通用服务的线程,并且这种线程并不属于程序中不可或缺的部分(来自java编程思想)。
当所有用户线程结束的时候,程序终止。
在线程启动之前,调用setDaemon()方法,该线程变为后台线程。
在后台线程中创建的线程都是后台线程。
转载于:https://www.cnblogs.com/xiaosuye/p/10259994.html