`

线程的两种实现方式

    博客分类:
  • Java
 
阅读更多

2016.12.02

 

明天,哦不对,准确来说应该是今天考现场总线,就看了一点,但求不挂,今年的课都不知所云,练车,上课,实验,考试,各种忙。哈哈,不过值得庆幸的是,连续几天敲代码,竟然有了感觉,现在遇到了各种牛人,感觉能学到好多东西,也深深体会到自己作为一个学渣该好好学习了。

自定义线程一般有两种方式:

方式一:

        1.自定义一个类继承Thread类

        2.重写Thread类中的run方法,把自定义线程的任务写在run()方法上

        3.创建Thread的子类对象,并且调用start方法启动一个线程

注意:千万不要直接调用run()方法,调用start方法的时候线程开启,线程开启就会直接调用run();如果直接调用run()方法,就相当于调用了一个普通方法。

方式二:

         1.自定义一个类实现Runnable接口。

         2.实现Runable接口的run方法,把自定义线程的任务定义在run()方法上。

         3.创建Runnable实现类对象。

         4.创建Thread类的对象,并且把Runnable()实现类的对象作为参数进行传递。

         5.调用Thread对象的start方法开启一个线程。

public class Demo2 implements Runnable{
	public void run(){
		for(int i=0;i<100;i++){
			System.out.println(Thread.currentThread().getName()+":"+i);
		}
	}

	public static void main(String[] args) {
		//创建Runnable实现类的对象
		Demo2 d = new Demo2();
		//创建Thread类的对象, 把Runnable实现类对象作为实参传递。
		Thread t = new Thread(d,"庹成");//Thread类使用Target变量记录了d对象,
		//调用thread对象的start方法开启线程。
		t.start();
		
		/*
		  Thread类 的run方法
		  
		 *  @Override
		    public void run() {
		        if (target != null) {
		            target.run();  //就相当于Runnable实现类的对象的run方法作为了Thread对象的任务代码了。
		        }
		    }
		*/
	}

}

    这里有两个问题:

    问题1.请问Runnable实现类的对象是线程对象吗?

    Runnable实现类的对象不是一个线程对象,只不过是实现了Runnable接口的对象而已。

    问题2.为什么要把Runnable实现类的对象作为实参传递给Thread对象呢?作用是什么?

    作用就是把Runnable实现类的对象的run()方法作为了线程的任务代码去执行了。

推荐使用第二种,实现Runnable接口。因为java是单继承,多实现的

class SaleTicket implements Runnable{
	
	int  num = 50; // 票数	
	@Override
	public void run() {
		while(true){
			synchronized ("锁") {
				if(num>0){
					System.out.println(Thread.currentThread().getName()+"售出了第"+ num+"号票");
					num--;
				}else{
					System.out.println("售罄了..");
					break;
				}	
			}
		}		
	}
}

public class Demo4 {
	
	public static void main(String[] args) {
		//创建了一个Runnable实现类的对象
		SaleTicket saleTicket = new SaleTicket();
		//创建三个线程对象模拟三个窗口
		Thread thread1 = new Thread(saleTicket,"窗口1");
		Thread thread2 = new Thread(saleTicket,"窗口2");
		Thread thread3 = new Thread(saleTicket,"窗口3");
		//开启线程售票
		thread1.start();
		thread2.start();
		thread3.start();			
	}
}

 这里为什么不用static来修饰int num,会不会产生150张票,答案是不会,因为只创建了一个SaleTicket对象,加了之后不会怎样,就是java的生命周期变长了。

分享到:
评论

相关推荐

    多线程两种实现方式Java

    本篇将详细讲解Java中实现多线程的两种主要方法:继承Thread类和实现Runnable接口。 ### 继承Thread类 1. **创建子类**:首先,我们需要创建一个新的类,该类继承自Java的`Thread`类。这样,我们的类就拥有了`...

    Java中有两种实现多线程的方式以及两种方式之间的区别

    Java中有两种实现多线程的方式。一是直接继承Thread类,二是实现Runnable接口。那么这两种实现多线程的方式在应用上有什么区别呢?  为了回答这个问题,我们可以通过编写一段代码来进行分析。我们用代码来模拟铁路...

    java用线程的两种实现方式设计四个线程两次对J加1两次对J减1

    Java 语言提供了多种方式来实现多线程编程,今天我们将讨论其中的两种实现方式,并使用四个线程来演示对变量 J 的加一和减一操作。 实现方式一:通过继承 Thread 类 在 Java 中,我们可以通过继承 Thread 类来创建...

    Java有两种实现多线程的方式:通过Runnable接口、通过Thread直接实现,请掌握这两种实现方式,并编写示例程序。

    ### Java中的两种多线程实现方式 在Java中,实现多线程的两种主要方式分别是:**通过继承`Thread`类** 和 **实现`Runnable`接口**。下面将详细介绍这两种方式,并提供相应的示例程序。 #### 一、通过继承`Thread`...

    java用线程两种方式

    在Java中,创建和使用线程主要有两种方式,一种是继承Thread类,另一种是实现Runnable接口。这两种方式在使用上有一些区别,每种方式都有其特定的用法和特点。 首先,继承Thread类的方式。通过继承Thread类来创建...

    Qt创建线程的两种方式+线程池方式

    1.方式1:继承 QThread 类方式:...两种方式的选择取决于具体的需求和设计。仅需简单的线程操作,继承 QThread 类方式可能更为简洁。如果需要更灵活的线程控制和对象交互,使用类对象的 moveToThread() 方式可能更适合

    java线程:两种传统的实现方式.zip

    本文将深入探讨两种传统的Java线程实现方式,并通过一个具体的例子来阐述如何创建和管理这些线程。 首先,我们来看第一种线程实现方式:继承`Thread`类。当你创建一个新的类继承自`java.lang.Thread`,你可以重写它...

    Android(Java)线程的两种实现方式

    总的来说,理解和熟练掌握Android(Java)线程的这两种实现方式,对于提升应用性能和用户体验至关重要。在编写高效、流畅的Android应用时,合理地利用线程管理,能够确保应用程序在多任务环境下的稳定性和响应速度。

    用户级线程的介绍,怎样实现多线程等等

    在不同的操作系统和平台上,线程的实现方式有所不同。例如,POSIX的P-threads是用户级线程库,Java提供了自己的线程库,Windows2000/XP等使用内核级线程,而Linux系统上的实现则更加多样化,既有纯用户级线程也有...

    线程同步的四种方式

    事件对象有两种状态:有信号(Signaled)和无信号(Unsignaled)。当事件为有信号状态时,等待该事件的线程可以继续执行。事件有手动重置和自动重置两种类型。手动重置事件在释放一个等待线程后仍保持有信号状态,...

    实现Runnable接口和继承Thread类两种方式实现在屏幕上随机画正方形线程程序

    本文将深入探讨如何通过实现`Runnable`接口和继承`Thread`类两种方式来创建线程,并实现在屏幕上随机画正方形的程序。 首先,让我们了解线程的概念。线程是程序中的单一顺序控制流,一个进程可以包含多个线程,它们...

    java多线程的两种实现

    在Java中,有两种主要的实现多线程的方式:通过`Thread`类和通过实现`Runnable`接口。 1. **通过`Thread`类实现多线程** 当我们创建一个`Thread`类的子类时,可以重写`run()`方法来定义线程执行的任务。例如: ``...

    多线程两种方式和区别总结

    本篇文章将深入探讨两种实现多线程的方式:继承`Thread`类和实现`Runnable`接口,并分析它们之间的区别。 首先,让我们了解这两种方式的基本概念: 1. **继承Thread类**:这是创建多线程的直接方式,通过创建一个...

    两种多线程使用方式演示.rar

    首先,我们要了解多线程的两种基本实现方式: 1. **线程对象创建**:这是最常见的方式,程序员通过调用易语言提供的线程创建函数(如“创建线程”命令)创建一个新的线程。线程对象有自己的执行入口点,通常是一个...

    kafka demo 两种线程消费方式

    【标题】"Kafka Demo 两种线程消费方式"展示了在Kafka中处理消息的两种常见线程模型,这是理解Kafka消费者工作原理的关键部分。Kafka是一个分布式流处理平台,用于构建实时数据管道和应用,它允许生产者发布消息到...

    kafka demo ,两种线程消费方式

    在本文中,我们将深入探讨Apache Kafka的两种线程消费方式,这是基于提供的标题"Kafka Demo,两种线程消费方式"。Kafka是一种分布式流处理平台,广泛用于实时数据处理和消息传递。在这个示例中,我们将关注如何使用...

    Java多线程-对比创建多线程的两种方式

    Java多线程编程中,创建线程主要有两种方式:继承`Thread`类和实现`Runnable`接口。这两种方式虽然都能实现多线程,但它们在实际应用中有着不同的特性和适用场景。 首先,我们来看看继承`Thread`类的方式。这种方式...

    Java多线程技术 线程的死锁,详细阐述了多线程的两种实现方法: 由Thread类派生子类;实现Runnable接口

    通过深入理解线程的基本概念、生命期、状态转换、调度原则以及实现方式,可以有效地利用多线程来优化应用程序。同时,合理地处理线程间的同步和避免死锁也是构建稳定、可靠的多线程应用的关键。

    易语言两种多线程使用方式演示

    总结来说,易语言提供了“创建线程”和“启动进程”两种多线程实现方式,分别适用于不同场景。学习和掌握这些方法,对于易语言的开发者来说,是提高程序性能和解决复杂问题的重要技能。结合提供的源码,我们可以更...

    ios多线程开发的常用四种方式和基本使用

    本文将深入探讨四种常用的iOS多线程开发方式:pthread、NSThread、NSOperation及NSOperationQueue,以及Grand Central Dispatch(GCD)。 首先,让我们了解下pthread。pthread是POSIX线程库,它在iOS中被用于跨平台...

Global site tag (gtag.js) - Google Analytics