文档章节

java 创建线程的三种方式

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:02
字数 434
阅读 4
收藏 0

java创建线程有三种方式:

1:实现Runnable接口(无返回值)
2:继承Thread类(无返回值)
3:使用ExecutorService、Callable、Future(有返回值)

实现Runnable接口

java 依靠接口来实现多态,所以在实现了Runnable接口的同时可以继承其他的类。Thread类的构造方法可以接受一个Runnable参数。

package tablejava;
class  SomeClass{
}
public class MyRunnable extends SomeClass implements Runnable{
    @Override
    public void run() {
        System.out.println("开始");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("结束");
    }
    public static void main(String[] args) {

         MyRunnable myRunnable=new MyRunnable();
         Thread thread=new Thread(myRunnable);
         thread.start();
         }
}

直接继承自Thread类

线程的启动必须依赖Thread类型,Thread类型本身也是实现了Runnable接口,但是由于java的单继承规则,它不能再继承其他的类。

package tablejava;

public class MyThread extends Thread{
    
    public void run() {
        System.out.println("开始");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("结束");
    }
    public static void main(String[] args) {
         MyThread myThread=new MyThread();
         myThread.start();
    }
}

使用Callable接口和FutureTask实现有返回值得线程

package tablejava;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;


public class MyCallable extends SomeClass implements Callable<Integer> {

    

    @Override
    public Integer call() throws Exception {
        System.out.println("开始");
        Thread.sleep(3000);
        System.out.println("结束");
        return 10;
    }
    public static void main(String[] args) {
       MyCallable myCallable=new MyCallable();
       FutureTask<Integer> Ft = new FutureTask<Integer>(myCallable);
       Thread mythread=new Thread(Ft);
       mythread.start();
       try {
        int a=Ft.get();
        System.out.println("the answer is "+a);
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    }

    }
}

使用Callable接口和线程池实现带返回值得线程

package tablejava;

import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MyCallable2 extends SomeClass implements Callable<Integer>{

    @Override
    public Integer call() throws Exception {
        System.out.println("开始");
        Thread.sleep(3000);
        System.out.println("结束");
        return 10;
    }
    
    public static void main(String []args) {
        ExecutorService threadPool = Executors.newCachedThreadPool();
        CompletionService<Integer> cs = new ExecutorCompletionService<Integer>(threadPool);
        MyCallable2 mycallable2=new MyCallable2();
        cs.submit(mycallable2);
        int a;
        try {
            a = cs.take().get();
            System.out.println("the anwer is "+a);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

参考:
《java核心技术,卷I》
http://www.cnblogs.com/yezhenhan/archive/2012/01/09/2317636.html
http://www.cnblogs.com/baizhanshi/p/6425209.html

本文转载自:http://www.jianshu.com/p/9e3da1d87996

AllenOR灵感
粉丝 11
博文 2635
码字总数 83001
作品 0
程序员
私信 提问
Java 线程不安全的SimpleDateFormat

SimpleDateFormat是Java提供的一个格式化和解析日期的工具类 但是由于它是线程不安全的,多线程共用一个SimpleDateFormat实例对日期进行解析或者格式化会导致程序出错 问题重现 public class...

晨猫
2018/01/31
31
0
115个Java面试题及回答

解释下可用的线程状态. 在执行期间, 线程会处于以下状态中的一种: Runnable: 线程已准备就绪, 但没有立即运行. Running: 处理器正在执行的线程代码. Waiting: 处于阻塞状态的线程, 等待外部某...

Yamazaki
2014/04/25
10
0
tomcat 内存溢出错误记录

tomcat 内存溢出错误记录: 前提: 你的tomcat是如何启动的: 通过startup.bat方式启动直接tomcat, 或者eclipse下启动tomcat, 两种方式解决方案不同。 解决方案: 直接启动tomcat: 手动设置...

凡尘里的一根葱
2015/11/16
186
0
设计模式之单例模式(Singleton)(1)

单例模式是一种比较简单的设计模式,简单来说,就是确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 单例模式特点: 1)单例类只能有一个实例。 2)单例类必须自己创建自...

扎尔其
2018/07/29
0
0
JVM 虚拟机(对象创建,类加载器,执行引擎等),

1.揭开 Java 对象创建的奥秘? 2.class 文件结构详解? 3.详解 Java 类的加载过程? > Java 对象创建,class 文件结构 Java对象模型 。Java对象保存在堆内存中。在内存中,一个Java对象包含三...

desaco
2018/08/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
刚刚
0
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
729
10
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0
spring cloud

一、从面试题入手 1.1、什么事微服务 1.2、微服务之间如何独立通讯的 1.3、springCloud和Dubbo有哪些区别 1.通信机制:DUbbo基于RPC远程过程调用;微服务cloud基于http restFUL API 1.4、spr...

榴莲黑芝麻糊
今天
26
0
Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
昨天
75
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部