java创建线程方式
1.继承Thread类
public class ThreadCreator extends Thread{ public static void main(String[] args) {
//第一种方式:
ThreadCreator creator = new ThreadCreator();
Thread thread = new Thread(creator,"线程1");
thread.start();
//第二种方式:
Thread thread = new ThreadCreator();
thread.start();
//第三种方式:
new ThreadCreator().start();
} @Override
public void run() {
System.out.println(Thread.currentThread().getName() + "run");
}
}
2.实现Runnable接口
public class ThreadCreator implements Runnable{ public static void main(String[] args) {
ThreadCreator creator = new ThreadCreator();
Thread thread = new Thread(creator,"线程1");
thread.start();
} @Override
public void run() {
System.out.println(Thread.currentThread().getName() + "run");
}
}
3.实现Callable接口,与Runnable的区别:
1.Callable执行call()方法,具有返回值,通过使用FutureTask实例对象的get()方法获取,需要做异常处理。 Runnable执行run()方法,无返回值。
2.异常处理部分:run()方法遇到异常线程终止执行,挂起。call()方法可以捕捉异常处理后继续执行(此处说明是非执行逻辑部分异常)。
public class ThreadCreator implements Callable<Integer> { public static void main(String[] args) throws ExecutionException, InterruptedException {
ThreadCreator creator = new ThreadCreator();
FutureTask futureTask = new FutureTask(creator);
Thread thread = new Thread(futureTask,"线程");
thread.start();
System.out.println(futureTask.get());
} @Override
public Integer call() {
return 1024;
}
}
4.线程池ExecutorService
public class ThreadCreator{ static ExecutorService service = Executors.newFixedThreadPool(5); public static void main(String[] args) throws ExecutionException, InterruptedException {
//execute无返回值
service.execute(new ThreadTask(1,"1"));
//submit有返回值
Future<Integer> result = service.submit(new ThreadTaskCall());
System.out.println(result.get());
service.shutdownNow();
}
static class ThreadTask implements Runnable{
private int param1;
private String param2;
public ThreadTask(int param3,String param4){
this.param1 = param3;
this.param2 = param4;
}
@Override
public void run() {
System.out.println(param1+param2);
}
} static class ThreadTaskCall implements Callable<Integer>{
@Override
public Integer call() throws Exception {
return 1024;
}
}
}
线程池中submit和execute的区别:
① 可接受的任务类型不一样:execute只能接受Runnable任务,submit还可以接受Callable任务。
② 返回值:execute无返回值,任务一旦提交,无法在当前线程中监控执行结果。submit有一个Future类型的返回值,用来接收返回值或响应异常。通过get()方法获取。
submit底层还是调用的execute,只是在此基础上用future封装了一层,并将执行过程中产生的异常全部封装在一个变量中:
public void run() {
if (state != NEW ||
!UNSAFE.compareAndSwapObject(this, runnerOffset,
null, Thread.currentThread()))
return;
try {
Callable<V> c = callable;
if (c != null && state == NEW) {
V result;
boolean ran;
try {
result = c.call();
ran = true;
} catch (Throwable ex) {
result = null;
ran = false;
setException(ex);
}
if (ran)
set(result);
}
} finally {
runner = null;
int s = state;
if (s >= INTERRUPTING)
handlePossibleCancellationInterrupt(s);
}
}
protected void setException(Throwable t) {
if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING)) {
outcome = t;
UNSAFE.putOrderedInt(this, stateOffset, EXCEPTIONAL); // final state
finishCompletion();
}
}
另外,spring中的schedule注解借鉴使用了submit的处理方式。
5.匿名内部类
public class ThreadCreator { public static void main(String[] args) { //继承Thread类
new Thread() {
@Override
public void run() {
System.out.println("extends Thread Class!");
}
}.start();
//实现Runnable接口
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("implement Runnable!");
}
}).start();
//实现Callable接口
new Thread(new FutureTask<Integer>(new Callable() {
@Override
public Integer call() throws Exception {
return 1024;
}
})).start();
//lambda表达式
new Thread(() -> System.out.println("execute single code")).start();
new Thread(() -> {
System.out.println("execute multiple code");
}).start();
}
}
lambda线程池:
public class ThreadCreator { static ExecutorService service = Executors.newFixedThreadPool(5); static List list = new ArrayList(); public static void main(String[] args) {
service.execute(() -> execute()); //无返回值
Future future = service.submit(() -> execute()); //有返回值
list.add(future);
} public static void execute() {
//do something
}
}
java创建线程方式的更多相关文章
- -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中
本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait( ...
- java 创建线程方式
1.继承Thread类 子类覆写父类中的run方法,将线程运行的代码存放在run中. 建立子类对象的同时线程也被创建. 通过调用start方法开启线程. 2.实现Runnable接口 子类覆盖接口中的 ...
- 操作系统实现线程的几种模式 和 java创建线程的3个方式
操作系统实现线程的几种模式 和 java创建线程的3个方式 这是两个概念 在操作系统中,线程可以实现在用户模式下,也可以实现在内核模式下,也可以两者结合实现. 1.实现线程的三种方式: (1)继承t ...
- Java并发编程:Java创建线程的三种方式
目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...
- Java创建线程的三种主要方式
Java创建线程的主要方式 一.继承Thread类创建 通过继承Thread并且重写其run(),run方法中即线程执行任务.创建后的子类通过调用 start() 方法即可执行线程方法. 通过继承Th ...
- Java创建线程的四种方式
Java创建线程的四种方式 1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run方法,run()方法的内容就是该线程执行的内容 创建Thread子类的实例,即创建了线程对象. ...
- 当阿里面试官问我:Java创建线程有几种方式?我就知道问题没那么简单
这是最新的大厂面试系列,还原真实场景,提炼出知识点分享给大家. 点赞再看,养成习惯~ 微信搜索[武哥聊编程],关注这个 Java 菜鸟. 昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的 ...
- java创建线程的多种方式
java创建线程的四种方式 1.继承 Thread 类 通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程. 首先定义一个类来继承 Thread 类,重写 run 方法. 然 ...
- Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别
一. java中实现线程的方式有Thread和Runnable Thread: public class Thread1 extends Thread{ @Override public void r ...
随机推荐
- 基于soa的架构
SOA:Service Oriented Architecture面向服务的架构.也就是把工程拆分成服务层.表现层两个工程.服务层中包含业务逻辑,只需要对外提供服务即可.表现层只需要处理和页面的交互, ...
- mqtt.mini.js 使用
html文件里直接调用 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- 牛客大数加法-A+B
题目描述实现一个加法器,使其能够输出a+b的值.输入描述:输入包括两个数a和b,其中a和b的位数不超过1000位.输出描述:可能有多组测试数据,对于每组数据,输出a+b的值.示例1输入2 610000 ...
- 使用new时,会发生什么?
使用new来调用函数,或者说发生构造函数调用时,会自动执行下面的操作: 创建(或说构造)一个全新的对象. 这个新对象会被执行[[prototype]]连接. 这个新对象会绑定到函数调用的this. 如 ...
- SqlCacheDependency 缓存数据库依赖
启用SQL SERVER 通知 aspnet_regsql.exe -S <Server> -U <Username> -P <Password> -ed -d N ...
- MinGW x64 for Windows安装
1. 百度搜索MinGW gcc 或直接登录 MinGW gcc官网 http://www.mingw.org/ 2.选择左侧download链接,进入下载页面 3.下载安装包mingw-get-se ...
- PAT T1011 Cut Rectangles
大模拟题,按要求建立多边形,先定位斜边的位置,再分类讨论~ #include<bits/stdc++.h> using namespace std; ; struct node { dou ...
- 弹出USB大容量存储设备时出问题的解决方法
我的计算机->管理->系统工具->事件查看器->自定义视图->Kernel-Pnp->详情->进程ID 然后在任务管理器里找到该进程(任务管理器->查看 ...
- 关于c++的头文件和变量声明
写再最前面:摘录于柳神的笔记: C++的头⽂件⼀般是没有像C语⾔的 .h 这样的扩展后缀的,⼀般情况下C语⾔⾥⾯的头⽂件去掉 .h 然 后在前⾯加个 c 就可以继续在C++⽂件中使⽤C语⾔头⽂件中 ...
- Jlink不报错的方法
https://blog.csdn.net/yekui6254/article/details/85272767 方法:安装最新的jlink驱动,按下面网址下载 OllyDBG软件,根据上面说的方法修 ...