Thread和Runnable实现多线程(一)上

简介: 实现多线程,有两种方式,一种是继承 Thread 类,一种是实现 Runnable接口。

实现多线程,有两种方式,一种是继承 Thread 类,一种是实现 Runnable接口。


一. Thread 类


public class Thread extends Object  implements Runnable{
}


继承 Thread 实现多线程。


一.一 实现多线程操作


一.一.一 创建类, 继承 Thread


 class MyThreadDemo extends Thread {
        @Override
        public void run(){
      //多线程执行的方法
            for(int i=0;i<10;i++){
                System.out.println("输出:"+i);
            }
        }
  }


一.一.二 主线程调用


 @Test
    public void runTest2(){
    //实例化了两个对象。 
        MyThreadDemo thread1=new MyThreadDemo();
        MyThreadDemo thread2=new MyThreadDemo();
        //对同一个,是无法多次启动的。
        thread1.start();
        thread2.start();
    }


运行程序,查看控制台输出:


2020061909561636.png


会发现两个线程会交叉执行。 每一次运行,结果都是不一样的。


注意,调用的时候,是 .start() 方法,而不是 .run() 方法。 如果是 .run()方法的话,那就是调用普通的方法run(), 会依次执行,并不会并发执行。


另外,也要注意, 同一个线程,只能启动一次, 不能重复两次。


  @Test
    public void runTest2(){
        MyThreadDemo thread1=new MyThreadDemo();
        MyThreadDemo thread2=new MyThreadDemo();
        //对同一个,是无法多次启动的。
        thread1.start();
    //启动了两次,则会报错的。 
        thread1.start();
    }


java.lang.IllegalThreadStateException


一.二 多线程的时机


主程序中的代码,放置在启动之后,才可以触发多线程。


 @Test
    public void runTest3() throws Exception{
        //上半部分
        for(int i=0;i<10;i++){
            System.out.println("主线程输出:"+i);
        }
        MyThreadDemo thread1=new MyThreadDemo();
        //对同一个,是无法多次启动的。
        thread1.start();
        //下半部分
        /*for(int i=0;i<10;i++){
            System.out.println("主线程输出:"+i);
        }*/
    }


注释掉下半部分, 使用上半部分代码,运行程序:


20200619095624730.png


并不会触发多线程。


注释掉上半部分,使用下半部分代码,运行程序:


20200619095630200.png


触发了多线程。


二. Runnable 接口


@FunctionalInterface
public interface Runnable {
    public abstract void run();
}


有一个抽象方法, run()


二.一 Runnnable 接口实现多线程


二.一.一 创建类,实现 Runnable接口


class MyRunnableDemo implements Runnable{
        @Override
        public void run() {
            for(int i=0;i<10;i++){
                System.out.println("输出Runnable:"+i);
            }
        }
    }


二.一.二 主线程调用


@Test
    public void test1(){
        //实例化两次对象
        MyRunnableDemo myRunnableDemo1=new MyRunnableDemo();
        MyRunnableDemo myRunnableDemo2=new MyRunnableDemo();
        //分别放置到不同的线程里面
        Thread thread1=new Thread(myRunnableDemo1);
        Thread thread2=new Thread(myRunnableDemo2);
        //启动
        thread1.start();
        thread2.start();
    }


运行程序,看控制台输出:


2020061909563952.png


每一次运行,结果都是不一样的。


注意, 线程也可以创建一个 MyRunnableDemo 对象


 @Test
    public void test2(){
        //只实例化一次即可
        MyRunnableDemo myRunnableDemo1=new MyRunnableDemo();
        //将同一个对象,放置到不同的线程里面
        Thread thread1=new Thread(myRunnableDemo1);
        Thread thread2=new Thread(myRunnableDemo1);
        //启动
        thread1.start();
        thread2.start();
    }


运行程序,同样可以达到多线程的操作。


20200619095646498.png


常常采用,实际化一次对象的形式。

相关文章
|
23天前
|
Java C# Python
线程等待(Thread Sleep)
线程等待是多线程编程中的一种同步机制,通过暂停当前线程的执行,让出CPU时间给其他线程。常用于需要程序暂停或等待其他线程完成操作的场景。不同语言中实现方式各异,如Java的`Thread.sleep(1000)`、C#的`Thread.Sleep(1000)`和Python的`time.sleep(1)`。使用时需注意避免死锁,并考虑其对程序响应性的影响。
|
1月前
|
安全 Java
在 Java 中使用实现 Runnable 接口的方式创建线程
【10月更文挑战第22天】通过以上内容的介绍,相信你已经对在 Java 中如何使用实现 Runnable 接口的方式创建线程有了更深入的了解。在实际应用中,需要根据具体的需求和场景,合理选择线程创建方式,并注意线程安全、同步、通信等相关问题,以确保程序的正确性和稳定性。
104 11
|
2月前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
27 3
|
2月前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
51 2
|
2月前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
38 2
|
2月前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
44 1
|
1月前
|
Java
为什么一般采用实现Runnable接口创建线程?
因为使用实现Runnable接口的同时我们也能够继承其他类,并且可以拥有多个实现类,那么我们在拥有了Runable方法的同时也可以使用父类的方法;而在Java中,一个类只能继承一个父类,那么在继承了Thread类后我们就不能再继承其他类了。
26 0
|
3月前
|
存储 Java 程序员
优化Java多线程应用:是创建Thread对象直接调用start()方法?还是用个变量调用?
这篇文章探讨了Java中两种创建和启动线程的方法,并分析了它们的区别。作者建议直接调用 `Thread` 对象的 `start()` 方法,而非保持强引用,以避免内存泄漏、简化线程生命周期管理,并减少不必要的线程控制。文章详细解释了这种方法在使用 `ThreadLocal` 时的优势,并提供了代码示例。作者洛小豆,文章来源于稀土掘金。
【多线程面试题 二】、 说说Thread类的常用方法
Thread类的常用方法包括构造方法(如Thread()、Thread(Runnable target)等)、静态方法(如currentThread()、sleep(long millis)、yield()等)和实例方法(如getId()、getName()、interrupt()、join()等),用于线程的创建、控制和管理。
|
2月前
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
58 1
C++ 多线程之初识多线程