java基础——多线程的两种实现方式

第一种实现方式:继承Thread类,并实现run方法,这种情况下每个线程对象都有一个独立的run方法

package thread;
/*
@author zsben
@create 2020-01-03 9:52

多线程创建的第一种方法:继承于Thread类
    1.创建一个继承于Thread的类
    2.重写Thread类的run方法-->将此线程执行的操作声明在run中
    3.创建Thread子类对象
    4.通过此对象调用start方法:启动当前线程,调用当前线程的run方法
*/

//1.创建一个继承Thread类的子类
class MyThread extends Thread{
    //2.重写run
    @Override
    public void run() {
        for(int i=0;i<100;i++){
            if(i%2==0)
                System.out.println(Thread.currentThread().getName()+" "+i);
        }
    }
}

public class ThreadTest {
    public static void main(String[] args) {
        //3.创建MyThread对象
        MyThread myThread = new MyThread();

        //4.调用start方法
        myThread.start();

        //myThread.run();如果只调用run方法,则只执行run里的代码,不新建新线程
        //myThread.start();一个已经在run的线程无法再次start

        MyThread myThread1 = new MyThread();
        myThread1.start();

        for(int i=0;i<100;i++){
            if(i%2!=0)
                System.out.println(Thread.currentThread().getName()+" "+i);
        }

        //创建Thread类的匿名子类方式
        new Thread(){
            @Override
            public void run() {
                for(int i=0;i<100;i++){
                    if(i%2==0)
                        System.out.println(Thread.currentThread().getName()+" "+i);
                }
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                for(int i=0;i<100;i++){
                    if(i%2==1)
                        System.out.println(Thread.currentThread().getName()+" "+i);
                }
            }
        }.start();

    }
}

第二种实现方法:实现Runnable接口,并通过实现类作为参数new Thread对象

package thread;
/*
创建多线程的方式二:实现Runnable接口
1.创建一个实现了Runnable接口的类
2.实现类去实现Runnable中的抽象方法:run()
3.创建实现类的对象
4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
5.通过Thread类的对象调用start()

Thread源码里,有一个Runnable对象target,
当调用Thread(Runnable o)时,target就被赋值为o
此时调用run方法时,就会调用target(即o)的run方法
如果target==null,那么调用run方法时,调用的就是Thread自己的run方法,就是继承Thread类的情况了
比较两种线程创建方式:
    开发中优先选择实现Runnable接口方式
        1.实现的方式没有类的单继承局限性
        2.实现的方式更适合处理多线程有共享数据情况

线程生命周期:                                            sleep(time),join()
   sleep()时间到,join()结束 |--->--------阻塞------<---|  等待同步锁,wait()
        获得同步锁,notify() |                          |  suspend()已被废弃
            resume()已被废弃 |       获取cpu执行权       |
    新建----------------->就绪<---------------------->运行------------------->死亡
            start()             失去cpu执行权或yield()       run()执行完,stop(),
                                                            出现Error或异常且没处理

@author zsben
@create 2020-01-03 13:16
*/

//1.创建一个实现了Runnable接口的类
class MyRunnable implements Runnable{

    //2.实现类去实现Runnable中的抽象方法:run()
    @Override
    public void run() {
        for(int i=0;i<100;i++)
            if(i%2==0)
                System.out.println(Thread.currentThread().getName()+":"+i);
    }
}

public class RunnableTest {
    public static void main(String[] args) {
        //3.创建实现类的对象
        MyRunnable myRunnable = new MyRunnable();
        //4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
        Thread t1 = new Thread(myRunnable);
        //5.通过Thread类的对象调用start()
        t1.start();

        //再启动一个线程,run方法还是那个myRunnable对象里的run方法
        Thread t2 = new Thread(myRunnable);
        t2.start();
    }
}

原文地址:https://www.cnblogs.com/zsben991126/p/12148235.html

时间: 2024-09-30 21:29:56

java基础——多线程的两种实现方式的相关文章

java中多线程的两种创建方式

一丶继承Thread类实现多线程 第一步:继承Thread类第二步:重写run()方法第三步:创建继承了Thread类的对象 , 调用start()方法启动. //线程创建方式一 : /* 第一步:继承Thread类 第二步:重写run()方法 第三步:创建继承了Thread类的对象 , 调用start()方法启动. */ public class TestThread extends Thread{ @Override public void run() { for (int i = 0; i

java 实现多线程的两种方式

一.问题引入 说到这两个方法就不得不说多线程,说到多线程就不得不提实现多线程的两种方式继承Thread类和实现Runable接口,下面先看这两种方式的区别. 二. Java中实现多线程的两种方式 1.  继承Thread类 /** * 使用Thread类模拟4个售票窗口共同卖100张火车票的程序,实际上是各卖100张 */ public class ThreadTest { public static void main(String[] args){ new MyThread().start(

JavaLearning:多线程的两种实现方式

第一种 继承Thread类 package org.fan.threaddemo; public class MyThread extends Thread{ private String name; public MyThread(String name){ this.name=name; } public void run(){//覆写run()方法 for(int i=0;i<30;i++){ System.out.println("Thread运行:"+this.name

Java多线程的两种实现方式:继承Thread类 &amp; 实现Runable接口

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! 创建和启动线程的两种传统方式: Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法.

Java实现多线程的两种方式

实现多线程的两种方式: 方式1: 继承Thread类 A: 自定义MyThread类继承Thread类 B: 在MyThread类中重写run() C: 创建MyThread类的对象 D: 启动线程对象. 问题: a. 为什么要重写run方法? run()方法里封装的是被线程执行的代码 b. 启动线程对象用的是哪个方法? start()方法 c. run()和start()方法的区别? 直接调用run方法只是普通的方法调用 调用start方法先会启动线程,再由jvm调用run()方法 方式2:

细说java中Map的两种迭代方式

以前对java中迭代方式总是迷迷糊糊的,今天总算弄懂了,特意的总结了一下,基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代访问)Collection集合中的元素,Iterator也称为迭代器.它仅仅只有三个方法:hasNext(),next()和remove() hasNext():如果仍有元素可以迭代,则返回 true.(换句话说,如果 next 返回了元素而不是 抛出异常,则返回 true). next():返回迭代的下一个元素. re

Java中String的两种赋值方式的区别

本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过"字面量"赋值,如:String str="hello",第二种是通过new关键字创建新对象,如:String str=new String("hello").那么这两种赋值的方式到底有什么区别呢,下面给出具体分析. 1.首先回顾Java虚拟机的结构图. 在上面的

Java多线程的两种实现方式的区别以及深刻同步问题中的锁对象

首先我们知道创建线程有两种方式: 1.继承Thread类:2.实现Runnable接口. 但是这两这并非完全一样的.下面谈谈区别: 因为Java并不支持多继承的(接口是可以多继承接口的.不过一般我们不提),但支持多实现.当一个类继承了父类,就不能再继承Thread类,只能通过实现接口的形式创建线程. 继承Runnable接口更加符合面向对象的思想.线程分为两部分,一是线程对象,二是线程任务.继承Thread类,线程对象和线程任务(run方法内的代码)耦合在一起.一旦创建了Thread类的子类对象

多线程的两种实现方式

java中多线程可以采用两种方式实现,分别是继承Thread类重写run方法和实现Runnable接口重写run方法. 继承Thread类重写run方法举例如下: /* 需求:在主线程之外继承Thread类创建两独立线程,分别打印1至50. */ class ThreadTest extends Thread{ public void run(){ for(int i = 1; i <= 50; i++) System.out.println(Thread.currentThread().get