JavaThread、Runnable、Callable、线程池的使用

简介: JavaThread、Runnable、Callable、线程池的使用

一、继承Thread类



public class TestThread1 extends Thread {
  @Override
  public void run() {
    for(int i=1; i<=100; i++) {
      System.out.println("线程1的" + i);
      try {
        sleep(100);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}


public class TestThread2 extends Thread {
  @Override
  public void run() {
    for(int i=1; i<=100; i++) {
      System.out.println("线程2的:" + i);
      try {
        sleep(100);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
  }
}
public class Test {
  public static void main(String[] args) {
    TestThread1 thread1 = new TestThread1();
    TestThread2 thread2 = new TestThread2();    
    thread1.start();
    thread2.start();
  }
}


因为打一次要睡100ms,所以是一个线程一次

4bf6c4891b7441049a40cf985c7352e2.png


二、实现Runnable接口



public class TestRunnable1 implements Runnable {
  @Override
  public void run() {
    for(int i=0; i<100; i++) {
      System.out.println("线程1: " + i);
    }
  }
}


public class TestRunnable2 implements Runnable {
  @Override
  public void run() {
    for(int i=0 ;i<100; i++) {
      System.out.println("线程2: " + i);
    }
  }
}
public class Test {
  public static void main(String[] args) {
    TestRunnable1 run1 = new TestRunnable1();
    TestRunnable2 run2 = new TestRunnable2();
    new Thread(run1).start();
    new Thread(run2).start();
  }
}

2290e73fb8fd4b1d9e6adf82588ea445.png


三、继承Callable接口



public class TestCallable1 implements Callable<Integer> {
  @Override
  public Integer call() throws Exception {
    for(int i=0; i<100; i++) {
      System.out.println("线程1: " + i);
    }
    return null;
  }
}


public class TestCallable2 implements Callable<Integer> {
  @Override
  public Integer call() throws Exception {
    for(int i=0; i<100; i++) {
      System.out.println("线程2: " + i);
    }
    return 0;
  }
}


public class Test {
  public static void main(String[] args) throws InterruptedException, ExecutionException {
    FutureTask<Integer> task1 = new FutureTask<>(new TestCallable1());
    FutureTask<Integer> task2 = new FutureTask<>(new TestCallable2());
    new Thread(task1).start();
    new Thread(task2).start();
    System.out.println("[线程返回数据]:  " + task1.get());
    System.out.println("[线程返回数据]:  " + task2.get());
  }
}


四、线程池



public class TestThreadPool {
  public static void main(String[] args) {
    ExecutorService e = Executors.newCachedThreadPool();
    e.execute(new Test1());
    e.execute(new Test2());
  }
}
class Test1 implements Runnable{
  @Override
  public void run() {
    for(int i=0; i<100; i++) {
      System.out.println("线程1:" + i);
    }
  }
}
class Test2 implements Runnable{
  @Override
  public void run() {
    for(int i=0; i<100; i++) {
      System.out.println("线程2:" + i);
    }
  }
}


3cc9223d433c4be6964d88a1b0f824a0.png

相关文章
|
3月前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
58 7
|
19天前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
|
22天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
16 3
|
22天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
30 2
|
22天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
28 2
|
22天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
28 1
|
3月前
|
Java
Java中Runnable和Callable有什么不同
【8月更文挑战第9天】Java中Runnable和Callable有什么不同
17 1
|
4月前
|
存储 缓存 安全
(八)深入并发之Runnable、Callable、FutureTask及CompletableFuture原理分析
关于Runnable、Callable接口大家可能在最开始学习Java多线程编程时,都曾学习过一个概念:在Java中创建多线程的方式有三种:继承Thread类、实现Runnable接口以及实现Callable接口。但是实则不然,真正创建多线程的方式只有一种:继承Thread类,因为只有`new Thread().start()`这种方式才能真正的映射一条OS的内核线程执行,而关于实现Runnable接口以及实现Callable接口创建出的Runnable、Callable对象在我看来只能姑且被称为“多线程任务”,因为无论是Runnable对象还是Callable对象,最终执行都要交由Threa
|
5月前
|
Java
Runnable+CountDownLatch多线程的等待和通知
Runnable+CountDownLatch多线程的等待和通知
|
5月前
|
Java
Java中,有两种主要的方式来创建和管理线程:`Thread`类和`Runnable`接口。
【6月更文挑战第24天】Java创建线程有两种方式:`Thread`类和`Runnable`接口。`Thread`直接继承受限于单继承,适合简单情况;`Runnable`实现接口可多继承,利于资源共享和任务复用。推荐使用`Runnable`以提高灵活性。启动线程需调用`start()`,`Thread`直接启动,`Runnable`需通过`Thread`实例启动。根据项目需求选择适当方式。
57 2