JUC---00创建线程的方式
一、继承Thread类
1 package com.jenne.mydemo;
2
3 public class TestMyThread {
4 public static void main(String[] args) {
5
6 //启动两个线程
7 MyThread my1 = new MyThread();
8 my1.start();
9 MyThread my2 = new MyThread();
10 my2.start();
11 for (int i = 10; i >= 1; i--) {
12 System.out.println(Thread.currentThread().getName() + "线程:======" + i);
13 }
14
15 }
16 }
17
18 //创建线程类
19 class MyThread extends Thread {
20 @Override
21 public void run() {
22 for (int i = 1; i <= 10; i++) {
23 System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
24 }
25 }
26 }
二、实现Runnable接口
1 package com.jenne.mydemo;
2
3 public class TestMyThread {
4 public static void main(String[] args) {
5
6 //启动两个线程
7 MyThread my1 = new MyThread();
8 my1.start();
9 MyThread my2 = new MyThread();
10 my2.start();
11
12 //主线程运行程序
13 for (int i = 10; i >= 1; i--) {
14 System.out.println(Thread.currentThread().getName() + "线程:======" + i);
15 }
16
17 }
18 }
19
20 //创建线程类
21 class MyThread extends Thread {
22 @Override
23 public void run() {
24 for (int i = 1; i <= 10; i++) {
25 System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
26 }
27 }
28 }
三、实现Callable接口
package com.jenne.mydemo; import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask; /**
* Callable<V>接口使用过程:
* 1.创建资源类实现Callable接口,可以设置不同的泛型
* 2.注意Callable不能直接使用,要用第三方类(java.util.concurrent.FutureTask<V>是Runnable接口的实现类)间接实现跟Thread的链接
* 3.创建中间类:FutureTask<Object> ft = new FutureTask<Object>(new MyCallable());
* 执行使用new Thread(ft).start();
*/ public class TestMyCallable {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<Object> ft = new FutureTask<Object>(new MyCallable());
FutureTask<Object> ft1 = new FutureTask<Object>(new MyCallable()); //开启两个线程
new Thread(ft).start();
new Thread(ft1).start(); //主线程
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
} //获取call()方法的返回值
System.out.println(ft.get());
System.out.println(ft1.get());
}
} class MyCallable implements Callable<Object> { @Override
public Object call() throws Exception {
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
}
return "我是返回值";
}
}
四、线程池创建线程
package com.jenne.mydemo; import org.junit.jupiter.api.Test; import java.util.concurrent.*; /**
* 使用Executors工厂类里面的静态方法创建不同的线程池
* 1.创建一个线程池,池里有nThreads个固定的线程
* public static ExecutorService newFixedThreadPool(int nThreads)
*
* 2.一个任务一个任务的执行,池中只有一个线程
* public static ExecutorService newSingleThreadExecutor()
*
* 3.池中没有线程,线程池根据需要创建新线程,可扩容,遇强则强
* public static ExecutorService newCachedThreadPool()
*
* 上述三种使用很少,一般使用自定义线程池java.util.concurrent.ThreadPoolExecutor类:
* public ThreadPoolExecutor(
* int corePoolSize, 线程池中的常驻核心线程数
* int maximumPoolSize, 线程池中能够容纳同时执行的最大线程数,此值必须大于等于1
* long keepAliveTime, 多余的空闲线程的存活时间当前池中线程数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余线程会被销毁直到只剩下corePoolSize个线程为止
* TimeUnit unit, keepAliveTime的单位.例:[TimeUnit.SECONDS.sleep(3)]等待3秒
* BlockingQueue<Runnable> workQueue, 任务队列,被提交但尚未被执行的任务。(后面讲这个阻塞队列)
* ThreadFactory threadFactory, 表示生成线程池中工作线程的线程工厂,用于创建线程,一般默认的即可
* RejectedExecutionHandler handler 拒绝策略,表示当队列满了,并且工作线程大于等于线程池的最大线程数(maximumPoolSize)时如何来拒绝请求执行的runnable的策略)
*
* 拒绝策略(实现了 java.util.concurrent.RejectedExecutionHandle接口【当需要执行的线程数量大于maximumPoolSize+workQueue的数量会执行拒绝策略】):
* AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止系统正常运行
* CallerRunsPolicy:“调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。
* DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加人队列中尝试再次提交当前任务。
* DiscardPolicy:该策略默默地丢弃无法处理的任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种策略。
*/
public class TestMyExecutorService { @Test
public void testFixedThreadPool() {
ExecutorService es = Executors.newFixedThreadPool(3); //调用submit(new Runnable() )方法开启线程,
for (int i = 1; i <= 10; i++) {
es.submit(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
}
}
});
} //main线程执行代码
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
} //关闭线程池,使用后线程池被摧毁
es.shutdown();
} @Test
public void testSingleThreadExecutor() {
ExecutorService es = Executors.newSingleThreadExecutor(); //调用submit(new Runnable() )方法开启线程,
for (int i = 1; i <= 10; i++) {
es.submit(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
}
}
});
} //main线程执行代码
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
} //关闭线程池,使用后线程池被摧毁
es.shutdown();
} @Test
public void testCachedThreadPool() {
ExecutorService es = Executors.newCachedThreadPool(); //调用submit(new Runnable() )方法开启线程,
for (int i = 1; i <= 10; i++) {
es.submit(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
}
}
});
} //main线程执行代码
for (int i = 1; i <= 10; i++) {
System.out.println(Thread.currentThread().getName() + "线程:======" + i + "次");
} //关闭线程池,使用后线程池被摧毁
es.shutdown();
} @Test
public void testThreadPoolExecutor() { ExecutorService es = new ThreadPoolExecutor(
2,
5,
3L,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(3),
Executors.defaultThreadFactory(),
//new ThreadPoolExecutor.DiscardPolicy()
//new ThreadPoolExecutor.DiscardOldestPolicy()
new ThreadPoolExecutor.CallerRunsPolicy()
//new ThreadPoolExecutor.AbortPolicy()
); try {
for (int i = 1; i <= 10; i++) {
es.submit(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "线程:======");
}
});
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭线程池,使用后线程池被摧毁
es.shutdown();
}
}
}
JUC---00创建线程的方式的更多相关文章
- Java 创建线程的方式
想必大家在Java面试中经常会被问到有关线程的问题,最常见的莫过于“Java有哪几种创建线程的方式呢?” 稍稍了解过,或者在日常开发中也都会用到以下几种方式: ①继承Thread类(真正意义上的线程类 ...
- Java学习笔记-多线程-创建线程的方式
创建线程 创建线程的方式: 继承java.lang.Thread 实现java.lang.Runnable接口 所有的线程对象都是Thead及其子类的实例 每个线程完成一定的任务,其实就是一段顺序执行 ...
- Java多线程学习总结--线程概述及创建线程的方式(1)
在Java开发中,多线程是很常用的,用得好的话,可以提高程序的性能. 首先先来看一下线程和进程的区别: 1,一个应用程序就是一个进程,一个进程中有一个或多个线程.一个进程至少要有一个主线程.线程可以看 ...
- 7. Callable 创建线程的方式三
package com.gf.demo06; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionEx ...
- java线程(1)——三种创建线程的方式
前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...
- java线程——三种创建线程的方式
前言 线程,英文Thread.在java中,创建线程的方式有三种: 1.Thread 2.Runnable 3.Callable 在详细介绍下这几种方式之前,我们先来看下Thread类和Runnabl ...
- java中创建线程的方式
创建线程的方式: 继承thread 实现runnable 线程池 FurureTask/Callable 第一种:继承thread demo1: public class demo1 { public ...
- Java之创建线程的方式四:使用线程池
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.c ...
- Java之创建线程的方式三:实现Callable接口
import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util ...
- 创建线程的方式三:实现Callable接口-----JDK5.0 新增
package com.yhqtv.java2; /* * 创建线程的方式三:实现Callable接口-----JDK5.0 新增 * * 如何理解实现Callable接口的方式创建多线程比实现Run ...
随机推荐
- 《Redis入门指南》笔记
第1章 简介 1.1 历史与发展 2008年 意大利创业公司创始人因对mysql性能不满意,于是他决定开发redis. 2009年 redis初版由他一个人开发完成.redis是"remot ...
- vue项目中视频播放结束返回首页出现1秒左右的白屏问题
vue项目的性能优化问题,一直以来都是大家比较关注的. 近日负责的项目中,使用了SignalR实时通讯,客户端中点击发起播放视频的请求到服务器,服务器接到请求后再调用前端的播放视频方法,以此来达到播放 ...
- kafka-Reblance
谁来执行Rebalance以及管理consumer的group呢 coordinator来执行对于consumer group的管理,当consumer group的第一个consumer启动的时候, ...
- Java知识系统回顾整理01基础04操作符04位操作符
一.位操作符 位操作符在实际工作中用的并不常见,但是我比较纠结这些位操作.所以实际练习位操作符的每一个操作符的操作实例来理解其具体含义. 建议: 如果确实感兴趣,就看看,个人建议跳过这个章节. 真正工 ...
- puts()和gets()函数
puts()和gets()函数 1. puts()函数 puts()函数用来向标准输出设备(屏幕)写字符串并换行, 其调用格式为: puts(s); 其中s为字符串变量(字符串数组名或字符串指针). ...
- P 4315 月下毛景树
题目描述 毛毛虫经过及时的变形,最终逃过的一劫,离开了菜妈的菜园. 毛毛虫经过千山万水,历尽千辛万苦,最后来到了小小的绍兴一中的校园里. 爬啊爬~爬啊爬毛毛虫爬到了一颗小小的"毛景树&quo ...
- Zookeeper基础理论
Zookeeper是分布式开源协调服务, 主要用来解决分布式集群中应用系统的一致性问题. 本质上是分布式小文件存储系统. 特性 全局数据一致性(集群中每个服务器保存一份相同的数据副本,Client ...
- Spring Boot入门系列(二十)快速打造Restful API 接口
spring boot入门系列文章已经写到第二十篇,前面我们讲了spring boot的基础入门的内容,也介绍了spring boot 整合mybatis,整合redis.整合Thymeleaf 模板 ...
- 用于编写下一代JavaScript的编译器。
下载 用于编写下一代JavaScript的编译器. 支持巴别塔 Babel(发音为babble)是一个由社区驱动的项目,被许多公司和项目使用,由一群志愿者维护.如果你愿意帮助支持这个项目的未来,请考虑 ...
- xshell选项卡不见了
最近使用xshell的时候发现建立多个选项卡的时候,因为没有选项卡,所以不能切换. 弄了好一会儿才弄出来 点击会话选项卡或者Ctrl + Shift + T可以调出来