多线程的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种方式
65 0
|
5月前
|
大数据 C#
C#实现多线程的几种方式
C#实现多线程的几种方式
多线程的线程工具的初步使用和原理详解
多线程的线程工具的初步使用和原理详解
77 0
|
Java 调度
多线程学习之多线程的三种实现方式及应用
多线程学习之多线程的三种实现方式及应用
58 0
|
Java API 调度
多线程的操作
多线程的操作
48 0
|
缓存 Java 数据库
项目中使用多线程的场景,多线程的优缺点
项目中使用多线程的场景,多线程的优缺点
208 0
|
存储 Java C++
多线程的2种实现方式
多线程的2种实现方式
104 0
|
设计模式 存储 安全
多线程(六):多线程案例
多线程(六):多线程案例
117 0
多线程(六):多线程案例
|
Java
Java实现多线程的第三种方式及多线程实现的方式间的比较
再调用get方法,就可以获取线程结束之后的结果。(==get方法一定要放在start之后执行,因为它是获取线程结束之后的结果,如果线程还没有开启或结束,那么get会在那卡着一直等==)
110 0
Java实现多线程的第三种方式及多线程实现的方式间的比较
|
存储
多线程原理和实现方式
多线程原理和实现方式
207 1