首页 > 编程语言 >咸鱼学Java-多线程基础

咸鱼学Java-多线程基础

时间:2022-12-14 15:04:13浏览次数:53  
标签:Runnable Java Thread start 线程 咸鱼 run 多线程 public


实现多线程的方法

1.继承Thread,并且重写run方法(线程体)
2.实现Runnable接口,实现run方法(线程体)
必须重写run

1.继承Thread

class MyThread extends Thread{

public MyThread(String name) {
//此处调用父类的构造方法,在父类中有个构造方法可以传入名称,作为线程的名字
super(name);
}

@Override
public void run() {
for (int i = 0; i < 10; i++) {
//Thread.currentThread().getName()此方法为获取当前进程的名称
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}

此时我们已经创建好了我们的线程类
运行(注意运行的时候要调用start方法)

public class ThreadTest {
public static void main(String[] args) {
//1.创建线程对象
Thread thread = new MyThread("My");
//2.调用start方法
thread.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}

运行后发现,其打印是交替打印的(如果不是交替,尝试多运行几次),此时就实现了多线程

2.实现Runnable接口

class MyThread1 implements Runnable{

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

此时有人会问了,只是实现了Runnable接口,那么怎么运行呢?在这个类中又没有start方法,此时创建线程的方法进行了改变。

public class ThreadTest {
public static void main(String[] args) {
//1.创建线程对象
//此构造方法的第一个参数为一个实现Runnable接口的类,第二个参数为线程名称,注意:此处不用线程名也可
Thread thread1 = new Thread(new MyThread1(), "my1");

//2.调用start方法
thread1.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}


}
}

运行后发现也是交替打印的

Runnable接口与Thread的区别

1.Runnable接口必须实现run方法,而Thread中run是个空方法,可以不重写
2.Runnable接口的实现类并不是真正的线程类,只是线程运行的目标类,要想运行必须依赖Thread类
3.Runnable适合与资源共享

扩展

这两种方法都没有实现 线程之间的数据共享,他们都是各自执行。
当使用继承Thread方法的时候需要共享一个数据的时候可以通过静态变量或者通过对象传送(因为对象传的为引用,所以他们共享一个)(两个方法都存在线程安全问题)


当通过实现Runnable接口的方式的时候

public class PrintNum {
public static void main(String[] args) {
//通过同一个Print创建线程
Print print = new Print();
Thread thread = new Thread(print, "1号:");
Thread thread1 = new Thread(print, "2号:");

thread.start();
thread1.start();
}
}
class Print implements Runnable{
int i=0;
@Override
public void run() {
for (; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}

除了 0其他的都只打印一次,无重复。


标签:Runnable,Java,Thread,start,线程,咸鱼,run,多线程,public
From: https://blog.51cto.com/u_12938555/5936987

相关文章

  • 剑指Offer-Java-用两个栈实现队列
    题目用两个栈来实现一个队列,完成队列的Push和Pop操作。队列中的元素为int类型。代码只需要来回倒就可以实现了。importjava.util.Stack;publicclassSolution{Stack......
  • 23-咸鱼学Java-Java中的栈
    栈的图示代码/***栈*@author焦焱**/publicclassStack{/***栈顶标记*/inttop;/***栈内元素*/int[]elem;/**......
  • LeetCode-Java-893. Groups of Special-Equivalent Strings
    题目YouaregivenanarrayAofstrings.TwostringsSandTarespecial-equivalentifafteranynumberofmoves,S==T.Amoveconsistsofchoosingtwoindices......
  • LeetCode-Java-575. Distribute Candies
    题目Givenanintegerarraywithevenlength,wheredifferentnumbersinthisarrayrepresentdifferentkindsofcandies.Eachnumbermeansonecandyofthecorr......
  • 能让Java开发者提高效率的10个工具
    ​ Java受到全球百万计开发者的追捧,已经演变为一门出色的编程语言。最终,这门语言随着技术的变化,不断的被改善以迎合变化的市场需求。无论你是否拥有一家科技公司,软件已经......
  • 剑指Offer-Java-重建二叉树
    题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍......
  • 剑指Offer-Java-序列化二叉树
    题目请实现两个函数,分别用来序列化和反序列化二叉树代码此题的核心点是如何表示二叉树,并且解释。/*publicclassTreeNode{intval=0;TreeNodeleft=null;......
  • Java做UI自动化和app自动化中动态代理@FindBy的工作原理【杭州多测师_王sir】【杭州多
    Java做UI自动化和app自动化中动态代理@FindBy的工作原理一、背景简介由于Selenium框架采用PageObject设计模式让测试代码与被测页面对象代码分离,因而提供了不少很方便的注......
  • 【都 Java19 了,还不了解 Java 8 ? 】一文带你深入了解 Java 8 新特性
    Java8(又称为jdk1.8)是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布Java8,它支持函数式编程,新的JavaScript引擎,新的日期API,新的Stream......
  • JAVA-枚举使用
    枚举在本教程中,我们将了解什么是Java枚举、它们解决的问题以及它们的一些设计模式如何在实践中使用。1.概述Java5首先引入了enum关键字。它表示一种特殊类型的类,它总......