多线程相关特点
-
并发性:多线程允许程序同时执行多个任务,从而实现并发性。这对于需要同时处理多个任务或者需要利用多核处理器的计算机来说非常重要。
-
资源共享:在多线程编程中,多个线程可以共享相同的内存空间和数据结构,这使得不同线程之间可以方便地进行通信和数据交换。
-
竞争条件:由于多个线程可以同时访问和修改共享资源,可能会出现竞争条件(Race Condition),导致数据不一致或者程序出现错误。因此,在多线程编程中需要合理地使用同步机制来避免竞争条件。
-
线程调度:操作系统负责对多线程进行调度,决定哪个线程获得执行的时间片,以及在多核处理器上如何分配线程的执行。
-
线程安全性:编写多线程程序需要考虑线程安全性,确保多个线程同时访问共享资源时不会出现数据错误或者崩溃。
-
线程优先级:线程可以设置优先级,告诉操作系统在调度时应该优先考虑哪些线程。
-
创建与销毁:创建线程需要消耗一定的系统资源,因此需要谨慎地管理线程的创建与销毁,避免资源浪费和性能下降。
创建多线程的三种方式
方式一:继承Thread重写run方法
public class Thread1 extends Thread {
//重写run方法实现多线程
public void run(){
for (int i = 0; i < 10; i++) {
System.out.println(getName()+"Hello Word"+"=>"+i);
}
}
}
public static void main(String[] args) {
Thread1 thread1=new Thread1();
thread1.start();
}
方式二:实现runnable接口
public class MyRunnabledemo implements Runnable {
@Override
public void run() {
for (int i = 1; i <=100; i++) {
System.out.println(Thread.currentThread().getName()+"-->当前执行的是->"+i);
}
}
}
方式三:实现Callable返回操作完毕的结果
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
int sum=0;
for (int i = 0; i < 10; i++) {
sum+=i;
}
return sum;
}
}
关于死锁(图示)
线程池
1.无上限线程池:
ExecutorService pool1= Executors.newCachedThreadPool();//无线程上限的线程池
2.可设置上限线程池
ExecutorService executorService = Executors.newFixedThreadPool(2);//创建一个线程上限为2的线程池
代码示例
public class ThreadPool {
public static void main(String[] args) {
//1.获取线程池对象
ExecutorService pool1 = Executors.newCachedThreadPool();//无线程上限的线程池
ExecutorService executorService = Executors.newFixedThreadPool(3);//创建有上限的线程池
//2.提交任务
pool1.submit(new MyRunnabledemo());
//3.销毁线程池
pool1.shutdown();
}
}
自定义线程池
线程池拒绝策略
自定义线程池代码
public class ThreadPool {
public static void main(String[] args) {
//1.获取线程池对象
ExecutorService pool1 = Executors.newCachedThreadPool();//无线程上限的线程池
ExecutorService executorService = Executors.newFixedThreadPool(3);//创建有上限的线程池
//2.提交任务
pool1.submit(new MyRunnabledemo());
//3.销毁线程池
pool1.shutdown();
// 自定义线程池
ThreadPoolExecutor pool =new ThreadPoolExecutor(
3,//核心线程数量,能小于0
6,//最大线程数,不能小于0,最大数量>=核心线程数量
60,//空闲线程最大存活时间
TimeUnit.SECONDS,//时间单位
new ArrayBlockingQueue<>(3),//任务队列
Executors.defaultThreadFactory(),//创建线程工厂
new ThreadPoolExecutor.AbortPolicy()//任务的拒绝策略
);
}
}
线程池小结
补充:获取电脑中最大线程数
//获取java虚拟机可利用的处理器数目
int count=Runtime.getRuntime().availableProcessors();
System.out.println(count);