Java线程的创建和启动

Java中创建线程有3种方式,直接上代码。

// 继承Thread类,重写run()方法
public class ThreadTest extends Thread {

    private int i;

    // 重写run方法
    @Override
    public void run() {
        for (; i < 20; i++) {
            System.out.println(getName() + " " + i);
        }
    }
}

对应的调用方式

new ThreadTest().start();

该方法

  • 劣势:已经继承了Thread类,不能再继承其他父类
  • 优势:编写简单,访问当前线程可以直接使用this
// 实现Runnable接口,实现run()方法
class ThreadRunnableTest implements Runnable {
    private int i;

    @Override
    public void run() {
        for (; i < 20; i++) {
            System.out.println(Thread.currentThread().getName() + "" + i);
        }
    }
}

对应的调用方式

ThreadRunnableTest runnableTest = new ThreadRunnableTest();
new Thread(runnableTest, "thread----1---").start();

该方法优劣势见方法3

// 实现Callable<T>接口,实现call()方法
// 可以设置有返回值,并抛出异常
class ThreadCallableTest implements Callable<Integer> {

    // 类似上面的run方法内容
    @Override
    public Integer call() throws Exception {
        int i = 0;
        for (; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
        return i;
    }
}

对应的调用方式

ThreadCallableTest threadCallableTest = new ThreadCallableTest();
FutureTask<Integer> task = new FutureTask<Integer>(threadCallableTest);
new Thread(task, "task--1--").start(); // 此处的task作为线程的target
// 打印返回值
try {
      System.out.println("task return:" + task.get());
} catch (Exception e) {
      e.printStackTrace();
}

该方法

  • 优势:实现接口,还可以继承其他类;
    多个线程共享同一个target对象,适合多个相同线程来处理同一份资源;
  • 劣势:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容