`
yulon
  • 浏览: 117833 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

创建多线程的几种方式

阅读更多

第一种方式:通过继承Thread类创建

new Thread() {// new Threah(){}表示创建一个匿名子类的实例对象,{}内是子类的代码
			// 重写父类的run方法
			public void run() {
				while (true) {
					try {// 必需try...catch
						Thread.sleep(3000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName());
				}
			}
		}.start();

 第二种方式:通过实现Runnable接口创建

// new Thread(new Runnable(){}).start();表示调用Threah对象接受的Runnable对象的run方法.
		new Thread(new Runnable() {
			public void run() {
				while (true) {
					try {
						Thread.sleep(3000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName());
				}
			}
		}).start();

 Thread内部run方法的代码:

 public void run() {
	if (target != null) {
	    target.run();
	}
    }

 target 是Runnable子类的实例对象,若通过Thread子类实现,则优先调用子类的run方法.其实Thread类也是实现了 Runnable接口.

使用第二种方式创建的好处:

            1、 多个线程共享同一份资源

            2、可以避免由于java单继承特性带来的局限性。

 

无论是继承还是实现都需要重写run方法,此方法为线程的主体.

 

模拟多个线程共享同一份资源

问题:一个火车站当天去往某地的车票一共有50张,由多个售票点负责售票.

若通过继承方式如下:

class Demo extends Thread
{
	private int ticket = 50 ;
	public void run()
	{
		while(this.ticket>0)
		{
			System.out.println("卖票:"+this.ticket--) ;
		}
	}
};
public class ThreadDemo04
{
	public static void main(String args[])
	{
		// 准备四个售票点
		Demo d1 = new Demo() ;
		Demo d2 = new Demo() ;
		Demo d3 = new Demo() ;
		Demo d4 = new Demo() ;

		d1.start() ;
		d2.start() ;
		d3.start() ;
		d4.start() ;
	}
};

 但这样打印的结果是:每个售票点都售票50张,不符合实际要求!当然你可以把ticket设置成为static,这样也可以符合要求.

第二种方式:

 

class Demo05 implements Runnable
{
	private int ticket = 50 ;
	public void run()
	{
		while(this.ticket>0)
		{
			System.out.println("卖票:"+this.ticket--) ;
		}
	}
};
public class ThreadDemo05
{
	public static void main(String args[])
	{
		// 四个售票点应该控制同一个资源:50
		Demo05 d = new Demo05() ;
		Thread t1 = new Thread(d) ;
		Thread t2 = new Thread(d) ;
		Thread t3 = new Thread(d) ;
		Thread t4 = new Thread(d) ;

		t1.start() ;
		t2.start() ;
		t3.start() ;
		t4.start() ;
	}
};

 由于不同的线程调用的是同一个对象(Demo05 d = new Demo05() )的run方法,因此访问的ticket 都是同一个对象的成员属性.

 

但这两份代码都存在线程安全问题:ticket到最后可能会变成一个负数,如在while循环开始加一段:

		try {
				Thread.sleep(300);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

 

这样ticket最后打印的值就会出现负数!  解决的方法线程同步.在下一节里讲

 

4
0
分享到:
评论

相关推荐

    linux下C语言多线程编程实例

    多线程是指在一个进程中创建多个执行流,每个线程都有自己的栈空间,共享进程的全局变量和打开的文件描述符。线程间通信和同步是多线程编程中的关键问题,防止数据竞争和死锁是实现高效并发的关键。 二、pthread库...

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

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

    创建多线程线程同步

    创建多线程通常涉及以下几个步骤: 1. 定义线程函数:线程函数是线程运行的入口点,每个线程都有自己的线程函数。 2. 创建线程:使用系统提供的API函数创建线程,例如在Windows API中使用`CreateThread`函数,而在...

    线程的几种控制方式以及线程间的几种通信方式

    创建线程使得多个任务可以在同一进程中并行执行。 2. **启动线程**:Java中通过`thread.start()`方法启动线程,Python中通过`thread.start()`调用开始执行线程。 3. **线程同步**:为了避免多个线程同时访问共享...

    pb真正的多线程,用createthread创建的多线程.rar

    总的来说,这个压缩包可能包含了一个PowerBuilder应用程序,该程序展示了如何通过调用`CreateThread`来创建多线程,并且可能涉及到文件扫描这样的并发操作。学习这个例子,开发者可以深入理解PowerBuilder中的多线程...

    VB可不可以创建多线程

    ### VB 创建多线程知识点详解 #### 一、引言 在编程领域中,多线程技术被广泛应用于提高程序的执行效率与响应性。Visual Basic(简称VB)作为一种流行的编程语言,在处理复杂的用户交互及后台任务时,多线程的支持...

    线程同步的四种方式

    在多线程编程中,线程同步是一种控制多个线程并发执行时访问共享资源的方式,以避免数据不一致和死锁等问题。以下是对线程同步的四种主要方式的详细解释: 1. **事件(Event)** 事件是Windows API提供的一种线程...

    C++类中创建多线程实现本地和远程打印

    在C++编程中,创建多线程是一种常见的方式,用于实现并发执行多个任务,比如这里的本地和远程打印。本示例中的代码可能涉及到以下几个关键知识点: 1. **多线程**:C++11及更高版本引入了`std::thread`库来支持线程...

    java 创建线程的几种方式

    在Java编程语言中,创建线程是实现多任务并发处理的关键。本文将详细阐述两种主要的线程创建方式,以及它们的特点和使用场景。...希望本文提供的内容能对你的学习和工作有所帮助,并激发你对Java多线程更深入的探索。

    初始化多线程的几种方法

    在处理多线程时,有几个关键概念和特性需要理解: - **线程同步**:为了避免线程间的冲突,需要同步对共享资源的访问。C#提供了`Mutex`, `Semaphore`, `Monitor`, `lock`等机制。 - **线程优先级**:每个线程都有...

    3种多线程实现同步方法

    本篇文章将深入探讨三种在C++中实现多线程同步的方法:事件对象、关键代码段和互斥对象。 首先,我们来看**事件对象**。事件对象是一种信号机制,用于线程间通信和同步。在Windows API中,CreateEvent函数创建一个...

    多线程的运用e语言多线程 e多线程

    在编程领域,多线程是一种重要的并发执行机制,它允许程序同时执行多个任务,从而提高系统资源利用率和程序响应速度。E语言(可能是错误输入或者是某个特定编程环境或语言的简称)中的多线程功能也不例外。本文将...

    多线程服务器的几种常用模型

    ### 多线程服务器的几种常用模型 #### 1. 进程与线程 在计算机科学中,**进程**和**线程**是两个重要的概念。进程是资源分配的基本单位,而线程则是调度的基本单位。每个进程都有自己的独立地址空间,这意味着不同...

    多线程编程示例

    多线程编程涉及到几个关键概念: 1. **线程同步**:当多个线程访问同一资源时,可能导致数据不一致。为此,可以使用锁(Mutex, Semaphore, Monitor等)或者`lock`关键字来确保同一时间只有一个线程访问共享资源。 2....

    详解Python并发编程之创建多线程的几种方法

    经过总结,Python创建多线程主要有如下两种方法: 函数 类 接下来,我们就来揭开多线程的神秘面纱。 . 学会使用函数创建多线程 在Python3中,Python提供了一个内置模块 threading.Thread,可以很方便地让我们创建...

    详细描述了Delphi多线程编程,超级简单易懂

    Delphi作为一种广泛使用的编程语言,提供了丰富的多线程支持,使得开发者能够轻松地构建高效的应用程序。 Delphi中的多线程编程主要包括以下几个方面: 1. **TThread类**:这是Delphi中进行多线程编程的核心。...

    Java多线程知识点总结

    Java多线程是Java编程语言中一个非常重要的概念,它允许开发者在一个程序中创建多个执行线程并行运行,以提高程序的执行效率和响应速度。在Java中,线程的生命周期包含五个基本状态,分别是新建状态(New)、就绪...

    稳定、方便、实用的VB6多线程技术(附老马的ActiveX多线程示例)

    VB6中的多线程主要通过两种方式实现:一是使用Microsoft的ActiveX EXE组件,二是通过API函数进行底层操作。下面将详细介绍这两种方法。 1. **ActiveX EXE组件**: 微软官方提供了ActiveX EXE组件,这是一种支持多...

    易语言多线程多次启动一个子程序

    通过理解多线程的基本概念,掌握易语言中的线程创建和管理方法,以及注意线程安全和同步,你可以编写出高效且稳定的多线程程序。在实际开发中,不断实践和优化,将是提升多线程编程能力的关键。

    易语言多线程访问网页源码,多线程访问网页,子程序_访问网页(1).zip

    在标题和描述中提到的“多线程访问网页”是指通过创建多个线程同时对多个网页进行访问,以提高整体的处理速度。通常,单线程的网络请求会依次执行,而多线程则可以让每个请求并行运行,显著减少等待时间,尤其是在...

Global site tag (gtag.js) - Google Analytics