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. zk的单机部署,与客户端的使用

    下载zk wget https://archive.apache.org/dist/zookeeper/stable/apache-zookeeper-3.5.5-bin.tar.gz 安装jdk t ...

  2. 兔子与兔子(字符串hash)

    传送门 很久很久以前,森林里住着一群兔子. 有一天,兔子们想要研究自己的 DNA 序列. 我们首先选取一个好长好长的 DNA 序列(小兔子是外星生物,DNA 序列可能包含 26 个小写英文字母). 然 ...

  3. 杭电1004 Let the Balloon Rise

    Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Oth ...

  4. leetcode 0208

    目录 ✅ 108. 将有序数组转换为二叉搜索树 描述 解答 py [tdo rev 0208]py知识:if not x: 和if x is not None:和if not x is None:使用 ...

  5. Titer软件学习(Translation Initiation siTE detectoR)

    Titer Source Codes lnk: https://github.com/zhangsaithu/titer 函数: collections.namedtuple()函数:https:// ...

  6. Kafka 消息的消费原理

    https://www.cnblogs.com/huxi2b/p/6061110.html 1.老版本的kafka的offset是维护在zk上的,新版本的kafka把consumer的offset维护 ...

  7. STM32cubeMX安装FW_F4容易出错失败的解决办法

    在CUBEMXV5.30安装F4的支持包V1.241的反复失败,无法自动生成代码.后来发现了一种办法: 在stm32的官网下载V1.24.0和en.patch_cubefw_f4.zip(V1.24. ...

  8. Update(Stage4):sparksql:第5节 SparkSQL_出租车利用率分析案例

    目录: 1. 业务2. 流程分析3. 数据读取5. 数据清洗6. 行政区信息 6.1. 需求介绍 6.2. 工具介绍 6.3. 具体实现7. 会话统计 导读 本项目是 SparkSQL 阶段的练习项目 ...

  9. leetCode练题——21. Merge Two Sorted Lists(照搬大神做法)

    1.题目 21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new l ...

  10. 字符流---Day32

    时隔多久,我又回来写博客了,最近忙于两个课设,五周,搞得头发都不知道掉了多少根了,还没成为程序员就开始掉了,等我成为一名程序员的时候岂不是要秃头了,IT界的人会不会帮我当成大佬了,哈哈哈哈,希望我以后 ...