zoukankan      html  css  js  c++  java
  • Java基础学习——多线程之创建任务

        这次来盘点一下Java中用线程执行任务的写法。

    1.扩展Thread

        最基本的实现方法是在创建一个继承Thread的新类,在其中覆盖run()方法执行任务。

     1 public class MyThread extends Thread {
     2     // 变量
     3     private String name = "";
    4 // 构造函数 5 public MyThread() {} 6 public MyThread(String name) { 7 this.name = name; 8 }
    9 // run方法中执行任务 10 @Override 11 public void run() { 12 System.out.println("这个线程的名字是" + name); 13 } 14 }

        new一个新的线程后,使用start()方法将其变为可运行(Runnable)状态,随后会根据系统调度执行或中断。另外,正在执行的线程也处在可运行状态。

    2.无返回值线程

        如果执行的任务没有返回值,可以让自己的线程类实现Runnable接口。

     1 public class MyRunnable implements Runnable {
     2     // 变量
     3     private String name = "";
     4     // 构造函数
     5     public MyThread() {}
     6     public MyThread(String name) {
     7         this.name = name;
     8     }
     9     // run方法中执行任务
    10     @Override
    11     public void run() {
    12         System.out.println("这个线程的名字是" + name);
    13     }
    14 }

        需要注意以下几点:

    1. Thread类其实是一个实现了Runnable接口的类,所以二者其实没什么区别。
    2. 虽然二者都提供了run()方法但是并不应该执行该方法,Thread类中实现了start()方法来启动,自己实现Runnable接口的类则需要手动添加该方法,或者是使用 new Thread(new MyRunnable()) 的方法执行。
    3. 实现Runnable接口的优势有两个,一是可以继承其他类,二是可以用lambda表达式构建匿名类简化代码。
    4. 之前提到线程池,可以用execute(Runnable runnable)执行线程,所以用这种方法会好一点。

    3.带返回值线程

        实现Runnable接口的方法没有返回值,而且不会抛出受查异常。如果有这些需求,需要实现Callable<T>接口。

     1 public class MyCallable implements Callable<String> {
     2     // 变量
     3     private String name = "";
     4     // 构造函数
     5     public MyCallable() { }
     6     public MyCallable(String name) {
     7         this.name = name;
     8     }
     9     // call方法中执行任务
    10     @Override
    11     public String call() throws Exception {
    12         System.out.println(name);
    13         return name;
    14     }
    15 }

        Callable<T>接口带有T类型的返回值,实现了该接口的类必须覆盖call()方法,这个方法可以抛出异常。

        实现了Callable<T>接口的线程类需要先用 FutureTask<T> result = new FutureTask<>(new MyCallable()) 创建一个对象,用 new Thread(result).start() 执行完毕后可以用result.get()获取T类型的返回值。

        在线程池中,用submit(Callable<T> callable)执行此类线程。

        

  • 相关阅读:
    Tarjan求图的连通性总结
    hdu3849 Tarjan求无向图的割边+map
    两种代码风格解决强连通分量解决加多少条边使整个图连通&多少个点可以到达所有点
    hdu 离线处理+并查集
    hdu 1325判断是不是树
    poj3041 最小点覆盖即最大匹配(匈牙利算法)(模板)
    poj 2186 tarjan求强连通分量(模板题)
    poj2135 最小费用最大流模板
    SPFA队列模板
    链表专项刷题
  • 原文地址:https://www.cnblogs.com/lycx/p/10083222.html
Copyright © 2011-2022 走看看