java创建线程的几种方式

1.通过实现Runnable接口创建线程

package com.javaBase.LineDistance;

/**
 * 〈一句话功能简述〉;
 * 〈功能详细描述〉
 *
 * @author jxx
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class testRunn implements Runnable {


    @Override
    public void run() {
        System.out.println("123");
    }
}
package com.javaBase.LineDistance;

/**
 * 〈一句话功能简述〉;
 * 〈多线程测试代码〉
 *
 * @author jxx
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class testLine {

    public static void main(String[] args){  
        Thread t = new Thread(new testRunn());
        t.start();
    }
}

2.通过实现callable接口创建线程

package com.javaBase.LineDistance;

import java.util.concurrent.Callable;

/**
 * 〈一句话功能简述〉;
 * 〈功能详细描述〉
 *
 * @author jxx
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class TestCallable implements Callable {

    @Override
    public Object call() throws Exception {
        System.out.println("123");
        return "1";
    }
}
package com.javaBase.LineDistance;

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

/**
 * 〈一句话功能简述〉;
 * 〈多线程测试代码〉
 *
 * @author jxx
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class testLine {

    public static void main(String[] args){
        Callable call = new TestCallable();
        FutureTask future = new FutureTask(call);
        Thread t2 = new Thread(new testRunn());
        t2.start();
    }
}

3.通过集成Thread类创建线程

package com.javaBase.LineDistance;

/**
 * 〈一句话功能简述〉;
 * 〈功能详细描述〉
 *
 * @author jxx
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class TestThread extends Thread {

    @Override
    public void run() {
        System.out.println("123");
    }

    public static void main(String[] args){
        Thread t = new TestThread();
        t.start();
    }
}

4.使用Executor框架来创建线程池

  在Java 5之后,并发编程引入了一堆新的启动、调度和管理线程的API。Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocurrent 包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。因此,在Java 5之后,通过Executor来启动线程比使用Thread的start方法更好,除了更易管理,效率更好(用线程池实现,节约开销)外,还有关键的一点:有助于避免this逃逸问题——如果我们在构造器中启动一个线程,因为另一个任务可能会在构造器结束之前开始执行,此时可能会访问到初始化了一半的对象用Executor在构造器中。

package com.javaBase.LineDistance;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 〈一句话功能简述〉;
 * 〈功能详细描述〉
 *
 * @author jxx
 * @see [相关类/方法](可选)
 * @since [产品/模块版本] (可选)
 */
public class TestExcetor {

    public static void main(String[] args){
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.execute(new testRunn());
        executorService.shutdown();
    }
}

Executor框架后面再详解。

5.Runnable和Callable的区别

  • Callable规定的方法是call(),Runnable规定的方法是run()
  • Callable的任务执行后可返回值,而Runnable的任务是不能返回值得
  • call方法可以抛出异常,run方法不可以
  • 运行Callable任务可以拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果。

 

posted @ 2019-10-10 11:26  莫等、闲  阅读(1518)  评论(0编辑  收藏  举报