多线程的4种方式

简介: 多线程的4种方式

第一种,实现Runnable接口

publicclassMyThreadimplementsRunnable {
@Overridepublicvoidrun() {
System.out.println("hello world");
    }
publicstaticvoidmain(String[] args) {
MyThreadmyThread=newMyThread();
Threadthread=newThread(myThread);
thread.start();
    }
}

第二种,继承Thread类

publicclassMyThread1extendsThread {
@Overridepublicvoidrun() {
System.out.println("hello");
    }
publicstaticvoidmain(String[] args) {
newMyThread1().start();
    }
}

第三种,实现Callable接口

publicclassMyThread2implementsCallable<String> {
@OverridepublicStringcall() throwsException {
System.out.println("call----");
return"call";
    }
publicstaticvoidmain(String[] args) throwsExecutionException, InterruptedException {
FutureTask<String>futureTask=newFutureTask<>(newMyThread2());
newThread(futureTask, "A").start();
System.out.println(futureTask.get());
    }
}

第四种,通过线程池获取线程

开发规范手册中推荐使用的

不要显式创建线程,请使用线程池。

当然

线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。


Executors返回的线程池对象的弊端如下:

1)FixedThreadPool和SingleThreadPool

允许的请求队列长度为Integer.MAX_VALUE(约为21亿),可能对堆积大量的请求,从而导致OOM

2)CacheThreadPool和ScheduledThreadPool

允许创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM

/*** 7个参数* 核心线程池大小* 最大核心线程池大小* 超时了没有人调用就会释放* 超时单位* 阻塞队列* 线程工厂:创建线程的,一般不用动Executors.defaultThreadFactory()* 拒绝策略*/publicThreadPoolExecutor(intcorePoolSize, intmaximumPoolSize, longkeepAliveTime, TimeUnitunit, BlockingQueue<Runnable>workQueue, ThreadFactorythreadFactory, RejectedExecutionHandlerhandle) {
}

四种拒绝策略:

  • new ThreadPoolExecutor.AbortPolicy() // 池满了,还有进来的,不处理,抛出异常
  • new ThreadPoolExecutor.CallerRunsPolicy() // 哪来的去哪里!
  • new ThreadPoolExecutor.DiscardPolicy() //队列满了,丢掉任务,不会抛出异常!
  • new ThreadPoolExecutor.DiscardOldestPolicy() //队列满了,尝试去和最早的竞争,也不会抛出异常!

线程池的最大的大小如何设置?

  1. CPU 密集型,几核,就是几,可以保持CPU的效率最高!
  2. IO 密集型,判断程序中十分耗IO的线程

获取CPU的核数

System.out.println(Runtime.getRuntime().availableProcessors());

目录
相关文章
多线程学习(二) 多线程创建4种方式
多线程学习(二) 多线程创建4种方式
64 0
|
5月前
|
大数据 C#
C#实现多线程的几种方式
C#实现多线程的几种方式
多线程的线程工具的初步使用和原理详解
多线程的线程工具的初步使用和原理详解
77 0
|
Java 调度
多线程学习之多线程的三种实现方式及应用
多线程学习之多线程的三种实现方式及应用
58 0
|
Java API 调度
多线程的操作
多线程的操作
48 0
|
缓存 Java 数据库
项目中使用多线程的场景,多线程的优缺点
项目中使用多线程的场景,多线程的优缺点
207 0
|
程序员 C++ 计算机视觉
C++多线程编程和同步机制:详解和实例演示
C++中的多线程编程和同步机制使得程序员可以利用计算机的多核心来提高程序的运行效率和性能。本文将介绍多线程编程和同步机制的基本概念和使用方法。
200 0
C++多线程编程和同步机制:详解和实例演示
|
存储 Java C++
多线程的2种实现方式
多线程的2种实现方式
104 0
|
设计模式 存储 安全
多线程(六):多线程案例
多线程(六):多线程案例
116 0
多线程(六):多线程案例
|
Java
Java实现多线程的第三种方式及多线程实现的方式间的比较
再调用get方法,就可以获取线程结束之后的结果。(==get方法一定要放在start之后执行,因为它是获取线程结束之后的结果,如果线程还没有开启或结束,那么get会在那卡着一直等==)
109 0
Java实现多线程的第三种方式及多线程实现的方式间的比较