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. -1-5 java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁 sleep()和wait()方法的区别 为什么wait(),notify(),notifyAll()等方法都定义在Object类中

     本文关键词: java 多线程 概念 进程 线程区别联系 java创建线程方式 线程组 线程池概念 线程安全 同步 同步代码块 Lock锁  sleep()和wait()方法的区别 为什么wait( ...

  2. java 创建线程方式

    1.继承Thread类 子类覆写父类中的run方法,将线程运行的代码存放在run中. 建立子类对象的同时线程也被创建. 通过调用start方法开启线程. 2.实现Runnable接口 子类覆盖接口中的 ...

  3. 操作系统实现线程的几种模式 和 java创建线程的3个方式

    操作系统实现线程的几种模式 和 java创建线程的3个方式  这是两个概念 在操作系统中,线程可以实现在用户模式下,也可以实现在内核模式下,也可以两者结合实现. 1.实现线程的三种方式: (1)继承t ...

  4. Java并发编程:Java创建线程的三种方式

    目录 引言 创建线程的三种方式 一.继承Thread类 二.实现Runnable接口 三.使用Callable和Future创建线程 三种方式的对比 引言 在日常开发工作中,多线程开发可以说是必备技能 ...

  5. Java创建线程的三种主要方式

    Java创建线程的主要方式 一.继承Thread类创建 通过继承Thread并且重写其run(),run方法中即线程执行任务.创建后的子类通过调用 start() 方法即可执行线程方法. 通过继承Th ...

  6. Java创建线程的四种方式

    Java创建线程的四种方式 1.继承Thread类创建线程 定义Thread类的子类,并重写该类的run方法,run()方法的内容就是该线程执行的内容 创建Thread子类的实例,即创建了线程对象. ...

  7. 当阿里面试官问我:Java创建线程有几种方式?我就知道问题没那么简单

    这是最新的大厂面试系列,还原真实场景,提炼出知识点分享给大家. 点赞再看,养成习惯~ 微信搜索[武哥聊编程],关注这个 Java 菜鸟. 昨天有个小伙伴去阿里面试实习生岗位,面试官问他了一个老生常谈的 ...

  8. java创建线程的多种方式

    java创建线程的四种方式 1.继承 Thread 类 通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程. 首先定义一个类来继承 Thread 类,重写 run 方法. 然 ...

  9. Java 使用线程方式Thread和Runnable,以及Thread与Runnable的区别

    一. java中实现线程的方式有Thread和Runnable Thread: public class Thread1 extends Thread{ @Override public void r ...

随机推荐

  1. socket 多连接

    socket 多连接 本文档为文档https://www.cnblogs.com/wodeboke-y/p/11241472.html 后续内容. 上一文档中的案例2给出了一个阻塞型socket se ...

  2. springmvc项目的搭建

    springmvc替代servlet的工作 Servlet - Springmvc        jsp ->Servlet (Springmvc)->Jsp springmvc配置文件 ...

  3. Robot Framework 使用【1】-- 基于Python3.7 + RIDE 最新版本搭建

    前言 Robot Framework作为公司能快速落地实现UI自动化测试的一款框架,同时也非常适合刚入门自动化测试的朋友们去快速学习自动化,笔者计划通过从搭建逐步到完成自动化测试的过程来整体描述它的使 ...

  4. Java面向对象编程 -4

    声明static属性 static 是一个关键字,这个关键字主要是用来定义属性和方法. static内存分析 在正常开发之中每一个对象都要保存有各自的属性 所以此时程序没有问题 但是如果country ...

  5. Windows下MySQL5.7版本中修改编码为utf-8

    我们新安装的MySQL数据库默认的字符是 latin1 ,所以每次新建数据库都要修改字符,非常麻烦.所以我们必须将它改成UTF8字符的. 修改方法如下: 一.修改MySQL的my.ini 首先在 \P ...

  6. 比较牛X的网站

    数学公式编辑与分享网站:https://www.mathcha.io/editor Markdown编辑网站:https://note.youdao.com/web 在线LaTex公式编辑器:http ...

  7. 前缀和-Big Water Problem (牛客)

    链接:https://ac.nowcoder.com/acm/problem/15164 题目描述 给一个数列,会有多次询问,对于每一次询问,会有两种操作: 1:给定两个整数x, y, 然后在原数组的 ...

  8. vector 踩过的坑

    今天,做LeetCode上的一道题,198题:Rob House,在纸上画了画,发现了重复的结构,就使用了递归的方式实现的 #include<iostream> #include<v ...

  9. idea激活,使用破解补丁无需注册码

    idea激活,使用破解补丁无需注册码 2017年08月19日 10:57:54 标签: idea / 破解 / 补丁 / 软件 / 13891 编辑 删除 idea激活,JetBrain旗下软件激活 ...

  10. ie9下浏览器 cosole.log()会阻止j下面的s加载

    ie9下浏览器 cosole.log()会阻止j下面的s加载,删掉多余的console.log().