关于多线程的两种创建方式的用法和选择

本文分别说明的继承Thread类和Runnable接口的两种方式。仅为个人见解,如有不妥还清指出。

先说一下并发和并行,

并行:多个任务可以同时做,常用与任务之间比较独立,互不影响。相当于很多人做很多件事(例学校篮球场,很多学生在不同的场地打球)

并发:相当于很多人在一个篮球场打球,只能轮着上因为只有一片场地。

首先第一种是继承Thread类的方法

直接上代码,实现的是火车票卖票的问题

class Windows extends Thread{    private static int tickets=100;    private static Object obj=new Object();    @Override    public void run() {

        while(true){            synchronized (obj){

                if(tickets>0){                    System.out.println(getName()+"卖票,票号为:"+tickets);                    tickets--;                }else {break;}            }        }    }}

public class Window {    public static void main(String[] args) {        Windows w1=new Windows();        Windows w2=new Windows();        Windows w3=new Windows();        w1.setName("窗口一");        w2.setName("窗口二");        w3.setName("窗口三");        w1.start();        w2.start();        w3.start();

    }}

第二种是通过implements Runnable接口实现的

两者都有共性:

1.由synchronized(同步监视器){   代码体   }构造

2.共享数据 都有多个线程操作的tickets

特别注意:继承Thread方法中 同步监视器(一种锁,可以是任何一个类的对象)obj务必要加static,修饰为静态属性,才能让后面new的w1,w2,w3共享一个tickets值,否则将出现重复和错票(输出0和-1)的情况。

探讨:

这里我也试了用this.getName(),会直接报错,无法运行。具体原因如下:

https://blog.csdn.net/dfshsdr/article/details/92760135

结论

1.Thread.currentThread表示当前代码段正在被哪个线程调用的相关信息。

2.this表示的是当前对象,与Thread.currentThread有很大的区别。

二者的选择:

个人理解是优先使用Runnable,不难发现继承Thread类使用了extends,而Java不能多重继承,如果还需要extends别的父类就会很麻烦。而runnable就可以规避这一问题 可以采用例如class A extends B implements Runnable的形式,更适合共享数据。

原文地址:https://www.cnblogs.com/celtics-huha/p/12070971.html

时间: 2024-10-07 11:16:07

关于多线程的两种创建方式的用法和选择的相关文章

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---11---多线程的两种创建方式

多线程的两种创建方式: 下面这些东西是API文档中的: public class Thread extends Object implements Runnable 线程 是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程.每个线程都可以或不可以标记为一个守护程序.当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护

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()方法.

String变量的两种创建方式

在java中,有两种创建String类型变量的方式: String str01="abc";//第一种方式 String str02=new String("abc")://第二种方式 第一种方式创建String变量时,首先查找JVM方法区的字符串常量池是否存在存放"abc"的地址,如果存在,则将该变量指向这个地址,不存在,则在方法区创建一个存放字面值"abc"的地址. 第二种方式创建String变量时,在堆中创建一个存放&q

java多线程总结一:线程的两种创建方式及优劣比较

1.通过实现Runnable接口线程创建 (1).定义一个类实现Runnable接口,重写接口中的run()方法.在run()方法中加入具体的任务代码或处理逻辑. (2).创建Runnable接口实现类的对象. (3).创建一个Thread类的对象,需要封装前面Runnable接口实现类的对象.(接口可以实现多继承) (4).调用Thread对象的start()方法,启动线程 示例代码: [java] view plaincopy <span style="font-size:16px;&

java多线程总结一:线程的两种创建方式及比较

1.线程的概念:线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行.当程序作为一个应用程序运行时,java解释器为main()方法启动一个线程. 2.并行与并发: (1)并发:在单处理器系统中,多个线程共享CPU时间,而操作系统负责调度及分配资源给它们. (2)并行:在多处理器系统中,多个处理器可以同时运行多个线程,这些线程在同一时间可以同时运行,而不同于并发,只能多个线程共享CP

多线程的两种实现方式

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

iOS多线程的几种创建方式

1.NSThread 2.NSOperationQueue 3.GCD NSThread: 创建方式主要有两种: [NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil]; 和 NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMetho