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

多线程编程

    博客分类:
  • J2SE
 
阅读更多

一、多线程的基本概念

线程是进程的一个执行单位,又称轻量进进程,他和进程一样拥有独立的执行控制,由操作系统负责调度。

而多线程是这样一种机制:他允许在程序中并发执行多个指令流,每个指令流都称为一个线程,多线程机制下的线程彼此间互相独立,比较容易共享数据,通过并发执行的方式来提高程序的效率和性能。

二、进程和线程的区别

1)线程的划分尺度小于进程,线程隶属于某个进程。

2)进程是程序的一种动态形式,是CPU、内存等资源占用的基本单位,而线程是不能独立的占有这些资源的。

3)进程之间的互相独立,通信比较困难,而线程之间共享一块内存区域,通信比较方便。

4)进程在执行过程中,包含比较固定的入口、执行顺序和出口,而线程的这些过程会被应用程序所控制。

三、多线程编程

3.1、将一个类成为线程类

让一个类成为线程类的方式有两种:一个是实现java.lang.Runnable接口,另一个是继承自java.lang.Thread类

3.2、Runnable接口和Thread类有何区别

1)线程类继承自Thread则不能继承其他类,而Runnable接口可以。

2)线程类继承自Thread相对Runnable来说,使用线程的方法更方便一些。

3)实现Runnable接口的线程类的多个线程,可以更方便的访问同一变量,而Thread类则需要内部类来进行替代。

 

3.3、启动一个线程

继承自Thread类的线程类,可以通过new关键字创建一个线程对象以后,执行start()方法开始一个线程,而实现了Runnable接口的线程类,需要用它的对象实例,作为Thread类构造方法的参数,创建一个Thread对象,然后调用start()方法开始一个线程。

3.4、sychronized来让线程同步

sychronized关键字代表要为某一段代码加上一个同步锁,这样的锁是绑定在某一个对象上面的,如果是同步代码块,需要为该sychronized关键字提供一个对象的引用;如果是同步方法,只需要加一个sychronized关键字的修饰。

sychronized为某段代码加上锁以后,某个线程进入该段代码之前,首先需要检查该锁是否被占用,如果没有被占用则继续执行;如果已经被占用,则需要等到该锁被释放以后才能继续执行。其中,线程执行完该段代码就是释放锁的标志。

 

//运行下段代码之后发现线程之间没有等谁执行完以后再执行,而是交织着执行的
class MyThread extends Thread 
{
	public static int index;
	public void run()
	{
		for(int i=0;i<100;i++)
		{
			System.out.println(getName()+" :"+index++);
		}
	}
}
public class SyncTest
{
	public static void main(String args [])
	{
		new MyThread().start();
		new MyThread().start();
		new MyThread().start();
	}
}

 

代码改进:

//运行下段代码之后,发现刚才的问题解决了,线程逐个执行完成
class MyThread extends Thread 
{
	public static int index;
	public static Object obj=new Object();//用任意一个对象来加锁
	public void run()
	{
		synchronized(obj)//为冲突加上同步代码块
		{
			for(int i=0;i<100;i++)
			{
				System.out.println(getName()+" :"+index++);
			}
		}
	}
}
public class SyncTest
{
	public static void main(String args [])
	{
		new MyThread().start();
		new MyThread().start();
		new MyThread().start();
	}
}

 

 

下面编写一个生产者跟消费者模型的多线程例子程序

public class Store 
{
	private final int MAX_SIZE;//仓库最大容量
	private int count;//当前的货物数量
	public Store(int n)
	{
		MAX_SIZE=n;
		count=0;
	}
	public synchronized void add()
	{
		while(count>=MAX_SIZE)
		{
			System.out.println("已经满了");
			try
			{
				this.wait();//如果满了,就放入等待池	
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
		count++;
		System.out.println(Thread.currentThread().toString()+" put "+count);
		this.notifyAll();//通知所有消费者线程可拿
	}
	public synchronized void remove()
	{
		while(count<=0)
		{
			System.out.println("空了");
			try
			{
				this.wait();
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
		System.out.println(Thread.currentThread().toString()+" get "+count);
		count--;
		this.notify();
	}
	public static void main(String [] args) 
	{
		Store s=new Store(5);
		//创建两个生产者和两个消费者
		Thread pro=new Producer(s);
		Thread con=new Consumer(s);
		Thread pro2=new Producer(s);
		Thread con2=new Consumer(s);
		pro.setName("producer");
		con.setName("consumer");
		pro2.setName("producer2");
		con2.setName("consumer2");
		//启动多线程
		pro.start();
		con.start();
		pro2.start();
		con2.start();
	}
}
class Producer extends Thread
{
	private Store s;
	public Producer(Store s)
	{
		this.s=s;
	}
	public void run()
	{
		s.add();
		try
		{
			Thread.sleep(1000);//休息一秒
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
	}
}
class Consumer extends Thread
{
	private Store s;
	public Consumer(Store s)
	{
		this.s=s;
	}
	public void run()
	{
		s.remove();
		try
		{
			Thread.sleep(1500);//休息1.5秒
		}
		catch (InterruptedException e)
		{
			e.printStackTrace();
		}
	}
}

 

分享到:
评论

相关推荐

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

    Linux 下 C 语言多线程编程实例 Linux 下的多线程编程是一种非常重要的技术,在实际应用中有非常广泛的应用范围。多线程编程可以大大提高程序的执行效率和响应速度。但是,多线程编程也存在一些复杂性,例如线程...

    Linux下的多线程编程.pdf

    "Linux下的多线程编程" Linux下的多线程编程是一种高效的程序设计方法,它可以将一个程序的任务划分为多个部分,每个部分是一个顺序控制流。多线程编程可以实现并行计算,高效利用多处理器,并且具有许多优点,如...

    C#多线程编程实例实战.pdf

    C#多线程编程实例实战 C#多线程编程实例实战是指在C#语言中实现多线程编程的实例和实战经验。多线程编程是指在同一个进程中创建多个线程,以便提高程序的执行效率和响应速度。在C#语言中,可以使用Thread类和线程池...

    JAVA多线程编程技术PDF

    这份“JAVA多线程编程技术PDF”是学习和掌握这一领域的经典资料,涵盖了多线程的全部知识点。 首先,多线程的核心概念包括线程的创建与启动。在Java中,可以通过实现Runnable接口或继承Thread类来创建线程。创建后...

    Windows多线程编程技术与实例(C++)(PDF)

    《Windows多线程编程技术与实例(C++)》是一本深入探讨Windows环境下多线程编程的书籍,特别适合正在学习或已经从事C++多线程开发的人员阅读。本书通过丰富的实例,详细讲解了如何在Windows操作系统中利用C++进行...

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

    Java多线程编程实战指南(核心篇)

    Java多线程编程实战指南(核心篇) 高清pdf带目录 随着现代处理器的生产工艺从提升处理器主频频率转向多核化,即在一块芯片上集成多个处理器内核(Core),多核处理器(Multicore Processor)离我们越来越近了――如今...

    嵌入式软件开发技术:第5章 嵌入式Linux多线程编程.ppt

    嵌入式Linux多线程编程 嵌入式Linux多线程编程是嵌入式系统开发中的一种重要技术,能够提高系统的效率和响应速度。本章节将详细介绍嵌入式Linux多线程编程的基本概念、线程的创建、同步和互斥、线程属性、多线程...

    多线程编程(完整版)

    多线程编程是一种重要的软件开发技术,特别是在处理并发任务、优化资源利用率和提高程序响应速度方面。通过创建多个线程,程序可以在同一进程中并行执行不同的任务,从而提高整体效率。 在操作系统层面,进程和线程...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...

    C++多线程编程.pdf

    C++多线程编程

    linux多线程编程.pdf

    Linux多线程编程是操作系统中并发程序设计的一个重要领域,它允许开发者在同一程序中创建多个线程,以实现并行执行,从而提高程序的执行效率和响应能力。Linux下的多线程编程通常基于POSIX线程(pthread)库来实现,...

    MFC多线程编程

    【MFC多线程编程】是Windows环境下使用Microsoft Foundation Class (MFC)库进行多线程应用程序开发的技术。MFC库是Visual C++提供的一种面向对象的类库,它简化了Windows API的使用,包括多线程编程。多线程在现代...

    c++多线程编程的十个例子

    以下是对“C++多线程编程的十个例子”的详细讲解,这些例子将帮助你在Windows环境下深入理解和应用多线程。 1. **创建线程** C++11引入了`std::thread`库来创建和管理线程。例如,你可以通过传递函数或成员函数...

    C#多线程编程实战完整源码

    C#多线程编程是开发高效、响应迅速的软件应用的关键技术之一,尤其在现代计算环境中,多核处理器和并发处理的需求日益增加。本资源"《C#多线程编程实战》完整源码"提供了丰富的实例,适用于学习和实践C#中的多线程...

    Linux多线程编程手册

    Linux多线程编程是现代操作系统中应用广泛的编程模式,尤其适用于需要同时执行多个任务的应用程序,它能够在多处理器或多核CPU系统中有效提升程序的执行效率,优化资源利用。多线程编程允许在同一个进程中创建多个...

    C#多线程编程源码奉上

    在这个“C#多线程编程源码”中,我们可以深入学习如何在Visual Studio 2008环境下利用C#进行多线程操作,包括UI线程和异步调用的实现。 1. **多线程基础** - **线程创建**:C#中可以使用`System.Threading.Thread`...

    c#多线程编程实战(原书第二版)源码

    《C#多线程编程实战(原书第二版)源码》是一本深入探讨C#中多线程技术的专业书籍,其源码提供了丰富的实践示例,帮助读者掌握并发编程的核心概念和技术。在C#中,多线程是实现高性能、响应式应用程序的关键组成部分...

    C#多线程编程实战 源代码

    本书是一本通俗易懂的C#多线程编程指南,通过70多个容易理解的示例,循序渐进地讲解C#5.0中的异步及并发编程,引导读者了解Windows下C#多线程编程的多样性。 通过阅读本书,你将学到: 使用原始线程、异步线程,...

Global site tag (gtag.js) - Google Analytics