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


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

相关文章
|
13天前
|
算法 安全 Java
【.NET Core】 多线程之(Thread)详解
【.NET Core】 多线程之(Thread)详解
19 1
|
19天前
|
Java 调度
Java 多线程系列Ⅰ(创建线程+查看线程+Thread方法+线程状态)
Java 多线程系列Ⅰ(创建线程+查看线程+Thread方法+线程状态)
|
20天前
|
Java 程序员
Java中的多线程编程:理解并应用Thread类和Runnable接口
【5月更文挑战第28天】在Java中,多线程编程是一个重要的概念,它允许同时执行多个任务。本文将深入探讨Java的多线程编程,包括Thread类和Runnable接口的使用,以及如何在实际项目中应用这些知识。我们将通过实例来理解这些概念,并讨论多线程编程的优点和可能的挑战。
|
20天前
|
Java 调度
"ava多线程基础-4:详解Thread类及其基本用法(二)
本文介绍了Java中线程中断和等待的相关概念。
27 0
|
20天前
|
Java Linux API
Java多线程基础-4:详解Thread类及其基本用法 (一)
Java 中的 `Thread` 类是用来管理线程的,每个线程都是通过 `Thread` 类的对象来描述。
60 0
|
25天前
|
Java
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
【JAVA学习之路 | 提高篇】创建与启动线程之二(继承Thread类)(实现Runnable接口)
|
25天前
|
Java 调度
【JAVA学习之路 | 提高篇】进程与线程(Thread)
【JAVA学习之路 | 提高篇】进程与线程(Thread)
|
1月前
|
安全 Java 调度
Java一分钟:多线程编程初步:Thread类与Runnable接口
【5月更文挑战第11天】本文介绍了Java中创建线程的两种方式:继承Thread类和实现Runnable接口,并讨论了多线程编程中的常见问题,如资源浪费、线程安全、死锁和优先级问题,提出了解决策略。示例展示了线程通信的生产者-消费者模型,强调理解和掌握线程操作对编写高效并发程序的重要性。
57 3
|
1月前
|
Java API 调度
【Java多线程】Thread类的基本用法
【Java多线程】Thread类的基本用法
16 0
|
1月前
|
算法 安全 调度
【C++入门到精通】 线程库 | thread类 C++11 [ C++入门 ]
【C++入门到精通】 线程库 | thread类 C++11 [ C++入门 ]
27 1