前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 创建线程有哪几种方法

Java 创建线程有哪几种方法

作者头像
水货程序员
修改2018-11-15 22:59:27
5.4K0
修改2018-11-15 22:59:27
举报
文章被收录于专栏:javathingsjavathings
  1. 继承 Thread 类,然后调用 start 方法。
代码语言:java
复制
class SampleThread extends Thread {
    //重写run方法,线程运行后,跑的就是run方法 
    public void run(){
       //System.out.println("");
    }
 
    public static void main(String[] args){
       Thread t1 = new SampleThread();
       Thread t2 = new SampleThread();
       t1.start();  //线程运行,调用的 run()方法.
       t2.start(); //线程运行,调用的 run()方法..  
    }
} 
  1. 实现 Runnable 接口的 run 方法, 然后再用 Thread 类包裹后,调用 start 方法。
代码语言:javascript
复制
class A implements Runnable{
 
    @Override
    public void run() {
        // implement run method here 
    }
 
    public static void main() {
        final A obj = new A();
 
        Thread t1 = new Thread(new A());
 
        t1.start();
    }
 
}
  1. 实现 Callable 接口的 call 方法,用 FutureTask 类包裹 Callable 对象。然后再用 Thread 类包裹 FutureTask 类,并调用 start 方法。call() 方法可以有返回值。
代码语言:javascript
复制
class MyCallable implements Callable {
    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        return sum;
    }
 
    public static void main(String[] args) throws Exception {
        MyCallable mc = new MyCallable(); //实例化 callable
 
        FutureTask oneTask = new FutureTask(mc); //用FutureTask包裹
        Thread oneThread = new Thread(oneTask); //用Thread包裹
        oneThread.start();
        System.out.print(oneTask.get()); //获取返回值
    }
}

Callable 方法在 Java 8 后,支持拉姆达表达式的写法,可以创建一个 FutureTask 类,语句上不是太罗嗦。

Callable 方式有以下几个优点:

  • 可以捕获线程上的异常。
  • 可以通过 get 方法得到返回值。
  • get 方法阻塞当前线程,直到调用的线程运行结束。
  • 可以取消线程的运行。

下面代码演示了使用 FutureTask 类运行线程,捕获异常的例子:

代码语言:javascript
复制
FutureTask<Integer> task=new FutureTask<Integer>(()->{
	throw new Exception("自定义异常");
});
 
new Thread(task).start();
 
try {
	System.out.println(task.get());
} catch (Exception e) {
	System.out.println(e.getMessage());
}

Java 6 之后,还可以通过创建线程池来创建线程,使用 ExecutorService 的 execute 方法:

代码语言:javascript
复制
ExecutorService es = Executors.newCachedThreadPool();
Runnable r = <your runnable here>;
es.execute(r);

原创文章,转载请注明出处!https://cloud.tencent.com/developer/article/1362835

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档