首页 > 编程语言 >Java拾贝第八天——多线程的创建

Java拾贝第八天——多线程的创建

时间:2023-10-21 20:49:03浏览次数:31  
标签:Java 拾贝 Thread MyThread 线程 m2 m1 多线程 public

Java拾贝不建议作为0基础学习,都是本人想到什么写什么

进程与线程

多线程是实现并发机制的一种有效手段,进程和线程一样都属于并发的一个单位。(线程比进程更小)
所谓多线程是指一个进程在执行过程中可以产生多个线程。这些线程可能同时存在、同时运行。

一个进程可以包含一个或多个线程,但至少会有一个线程。

image
一般把一个任务称为一个进程,浏览器就是一个进程,视频播放器是另一个进程。

线程一般指程序的运行流程

多线程机制是指可以同时运行多个程序块。

线程的创建

在Java中创建线程一般有两种方式:继承Thread类,实现Runnable接口

继承Thread类

必须重写Thread类的run()方法。

public class Test8 {
    public static void main(String[] args) {
        MyThread m1 = new MyThread("线程m1");
        MyThread m2 = new MyThread("线程m2");
        m1.run();
        m2.run();
    }
}

class MyThread extends Thread {//继承Thread
    private String name;

    public MyThread(String name) {//构造方法
        this.name = name;
    }

    @Override
    public void run() {//重写run方法
        for (int i = 0; i < 10; i++) {
            System.out.println(this.name + "=" + i);
        }
    }
}

程序运行结果:

线程m1=0
线程m1=1
线程m1=2
线程m1=3
线程m1=4
线程m1=5
线程m1=6
线程m1=7
线程m1=8
线程m1=9
线程m2=0
线程m2=1
线程m2=2
线程m2=3
线程m2=4
线程m2=5
线程m2=6
线程m2=7
线程m2=8
线程m2=9

从结果上看并没有交错运行,因为线程实际上压根没有启动。

上述写法只是普通地实例化了一个对象并调用起run方法。

正确应该使用Thread父类的start()方法。

修改代码:

public class Test8 {
    public static void main(String[] args) {
        MyThread m1 = new MyThread("线程m1");
        MyThread m2 = new MyThread("线程m2");
        m1.start();//调用start()方法
        m2.start();
    }
}

class MyThread extends Thread {
    private String name;

    public MyThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {//run()就是线程执行的任务
        for (int i = 0; i < 10; i++) {
            System.out.println(this.name + "=" + i);
        }
    }
}

程序运行结果:

线程m2=0
线程m1=0
线程m2=1
线程m1=1
线程m2=2
线程m1=2
线程m2=3
线程m2=4
线程m2=5
线程m2=6
线程m2=7
线程m2=8
线程m2=9
线程m1=3
线程m1=4
线程m1=5
线程m1=6
线程m1=7
线程m1=8
线程m1=9

成功了!哪个线程对象抢到了CPU资源谁就运行。所以程序的每次运行结果肯定是不一样的。

如果一个线程对象多次调用start()方法,将会抛出IllegalThreadStateException异常。

    public static void main(String[] args) {
        Thread thread = new Thread() {//匿名内部类
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println(i);
                }
            }
        };
        thread.start();
        thread.start();
    }

程序运行结果:

Exception in thread "main" java.lang.IllegalThreadStateException
	at java.lang.Thread.start(Thread.java:710)
	at moudle1.Test8.main(Test8.java:14)
0
1
2
3
4
5
6
7
8
9

实现Runnable接口

必须实现Runnable的run()方法。

但Runnable接口并没有提供默认的start(),那我们如何启动呢?

在Thread类中提供了构造方法,其传参就是Runnable接口的实现类

public Thread(Runnable target);
public class Test8 {
    public static void main(String[] args) {
        MyThread m1 = new MyThread("m1");
        MyThread m2 = new MyThread("m2");
        new Thread(m1).start();
        new Thread(m2).start();
    }
}

class MyThread implements Runnable {
    private String name;

    public MyThread(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(this.name + "=" + i);
        }
    }
}

程序运行结果:

m1=0
m2=0
m1=1
m2=1
m1=2
m2=2
m1=3
m2=3
m1=4
m2=4
m1=5
m2=5
m1=6
m2=6
m1=7
m2=7
m1=8
m2=8
m1=9
m2=9

从以上两种实现可以发现,无论使用哪种方式,最终都必须依靠Thread类才能启动线程。

注意:

    public static void main(String[] args) {

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类形式线程1");
            }
        }).start();

        System.out.println("main");

        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类形式线程2");
            }
        }).start();
    }

程序运行结果:

main
匿名内部类形式线程1
匿名内部类形式线程2

虽然代码书写方式是从上至下的,但实际上不得知哪个线程优先启动。

实际上这两个线程是平级。
image

标签:Java,拾贝,Thread,MyThread,线程,m2,m1,多线程,public
From: https://www.cnblogs.com/Ocraft/p/17779313.html

相关文章

  • Java基础 File 常见的成员方法(判断、获取)
     length()方法的细节:只能获取文件的大小,单位是字节。如果我们想要的单位是M,G等,可以不断地除以1024       len/1024:KB  len/1024/1024:MB  len/1024/1024/1024:G如果我们要获取一个文件夹的大小,需要把这个文件夹里面所有的文件大小都累加在......
  • java Intellij IDEA
    com/shop//││├─java.f97016ab│││└─.generated││├─sell.20409de3│││└─.generated││└─sell.f9743bdb││└─.generatedDOA层:定义实体.即有哪此字段及getter、setter等方法.数据库的curdcont......
  • Java基础 File
    File对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径。甚至这个路径可以是存在的,也可以是不存在的 File类常见的构造方法有三个:public File(String pathname)  →  根据文件路径创建文件对象。把字符串表示的路径变成File对象public File(String......
  • Java基础 自定义异常
    自定义异常的意义:让控制台的报错信息更加见名知意 步骤:1.定义异常类,类名要见名知意2.写继承关系。如果定义的异常是运行时异常,要继承RuntimeException;如果是编译时异常,直接继承Exception3.写空参构造4.写带参构造......
  • JavaWeb-初识Spring
    目录Spring简介Spring项目Bean管理基于xml的Bean管理创建对象属性注入基于xml+注解的Bean管理创建对象属性注入基于纯注解的Bean管理内容Spring简介Spring是什么Spring是于2003年兴起的一个轻量级的Java的开放源代码的设计层面框架......
  • java智慧工地云平台源码,以物联网、移动互联网技术为基础,结合大数据、云计算等,实现工程
    智慧工地项目源码 智慧工地云平台源码 PC端+APP端源码智慧工地将更多人工智能、传感技术、虚拟现实等高科技技术植入到建筑、机械、人员穿戴设施、场地进出关口等各类物体中,围绕人、机、料、法、环等各方面关键因素,彻底改变传统建筑施工现场参建各方现场管理的交互方式、工作方式......
  • Java基础 抛出异常(throws 和 throw)
    throws:写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常(编译时异常:必须要写;运行时异常:可以不写)语法:public void 方法() throws 异常类名1, 异常类名2...{}  throw:写在方法内,表示结束方法。用来手动抛出异常对象,把异常对象交给调用者处......
  • 算法篇---java算法应用
    算法篇---java算法应用 算法应用之百钱买白鸡(程序员副业--编程学习--业务交流--公众号:匠心程序定制)  案列说明:主要内容是:公鸡5元一只,母鸡3元一只,小鸡1元三只,问100元怎样可以买100鸡?思想:想要实现此算法,只要明白各种条件的关系即可,而且知道公鸡最多买20只,母鸡最多买33只......
  • Java基础 捕获异常 灵魂四问
    一、如果try中没有遇到问题,怎么执行?答:会把try里面所有的代码全部执行完毕,不会执行catch里面的代码。只有当出现了异常才会执行catch里面的代码 二、如果try中可能会遇到多个问题,怎么执行?答:会写多个catch与之对应。如果我们要捕获多个异常,这些异常中如果存在父子......
  • javaweb
    web.xml配置文件<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java......