`
singo107
  • 浏览: 30385 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java多线程基础(详解)

阅读更多

创建、启动线程有两种方式

 

1、继承Thread基类

public class AThread extends Thread {    
    public void run() {...}
}
new AThread().start();

2、实现Runnable接口

public class AClass implements Runnable {
	public void run() {...}
}
AClass aClass = new AClass();
new Thread(aClass).start();

 

sleep、join、yield、wait、notify、notifyAll、synchronized

 

sleep()是Thread的静态方法;

join()、yield()是Thread的实例方法;

wait()、notify()、notifyAll()是Object的实例方法,即任何一个类都有这3个方法;

synchronized为对象同步锁

 

sleep(long millis)在指定的时间段内挂起当前线程,此间不会被系统调度并执行,而其他线程可以抢夺CPU时间片,但如果该方法在同步方法(或同步代码区域)中调用,此间将不会释放锁,

sleep(long millis, int nanos),第二个参数表示精确到纳秒;

 

yield(),和sleep一样,只是让出当前线程,不会挂起一段时间

 

join(),是Thread的实例方法,主线程调用子线程的join()方法,主线程将阻塞,直到子线程运行结束,主线程才能重新启动,代码如下:

public class AThread extends Thread {

	public AThread(String name) {
		super(name);
	}

	@Override
	public void run() {
		for (int i = 0; i < 3; i++) {
			System.out.println("[" + super.getName() + "]:i=" + i);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
public class MainThread {

	public static void main(String[] args) {
		System.out.println("main thread start.");
		AThread aThread = new AThread("aThread");
		aThread.start();
		try {
			aThread.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("main thread end.");
	}
}

运行结果:

main thread start.

[aThread]:i=0

[aThread]:i=1

[aThread]:i=2

main thread end.

另外,对于join方法,只会阻塞调用子线程的上级线程,对于调用上级线程的上上级线程是没有阻塞作用的。

join(long millis)、join(long millis, int nanos) 表示阻塞上级线程的时间,如果超过指定时间,上级线程将不再阻塞。

 

wait()、notify()、nofityAll(),这3个方法是Object类的实例方法

在多线程处理中,会遇到这样的业务问题,如产品消费完之后必须等待生产者生产以后才能重新消费,以生产者、消费者问题为例,说说wait和notify的用法,代码下面有(请参看Factory类)。

 

 

1、调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj) {...} 代码段内。

2、调用obj.wait()后,线程A就释放了obj的锁,否则线程B无法获得obj锁,也就无法在synchronized(obj) {...} 代码段内唤醒A。

3、当obj.wait()方法返回后,线程A需要再次获得obj锁,才能继续执行。

4、如果A1,A2,A3都在obj.wait(),则B调用obj.notify()只能唤醒A1,A2,A3中的一个(具体哪一个由JVM决定)。

5、obj.notifyAll()则能全部唤醒A1,A2,A3,但是要继续执行obj.wait()的下一条语句,必须获得obj锁,因此,A1,A2,A3只有一个有机会获得锁继续执行,例如A1,其余的需要等待A1释放obj锁之后才能继续执行。

6、当B调用obj.notify/notifyAll的时候,B正持有obj锁,因此,A1,A2,A3虽被唤醒,但是仍无法获得obj锁。直到B退出synchronized块,释放obj锁后,A1,A2,A3中的一个才有机会获得锁继续执行。

 

另外,wait(long timeout)、wait(long timeout, int nanos)表示等待的最大时长。

 

以下是“生产者、消费者问题”的java源码

 

1、Product,表示产品实体

public class Product {

	private int id;

	public Product(int id) {
		this.id = id;
	}

	public int getId() {
		return id;
	}
}

2、Producer,生产者

public class Producer implements Runnable {

	private Factory factory;

	public Producer(Factory factory) {
		this.factory = factory;
	}

	@Override
	public void run() {
		Product product = null;
		for (int i = 0; i < 100; i++) {
			product = new Product(i);
			factory.push(product);
			System.out.println("+push product[" + product.getId() + "].");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

3、Consumer,消费者

public class Consumer implements Runnable {

	private Factory factory;

	public Consumer(Factory factory) {
		this.factory = factory;
	}

	@Override
	public void run() {
		while (true) {
			Product product = factory.pop();
			System.out.println("-pop product[" + product.getId() + "].");
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

4、Factory,工厂

public class Factory {

	private int index;
	private Product[] productArray = new Product[100];

	public synchronized void push(Product product) {
		while (index == productArray.length) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notifyAll();
		productArray[index] = product;
		index++;
	}

	public synchronized Product pop() {
		while (index == 0) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notifyAll();
		index--;
		return productArray[index];
	}
}

5、Control,主控程序

public class Control {

	public static void main(String[] args) {

		Factory factory = new Factory();

		Producer producer = new Producer(factory);
		Thread producerThread = new Thread(producer);
		producerThread.start();

		Consumer consumer1 = new Consumer(factory);
		Thread consumerThread1 = new Thread(consumer1);
		consumerThread1.start();
	}
}
分享到:
评论

相关推荐

    Java多线程编程详解

    ### Java多线程编程详解:深入理解与实践 #### 一、理解多线程机制 多线程,作为现代编程语言的重要特性之一,允许在单一应用程序内并发执行多个任务,从而极大提升了程序的效率和响应速度。在Java中,多线程的...

    Java多线程详解

    以上是对"Java多线程详解"主题的详细阐述,涵盖了Java多线程的基本概念、实现方式、线程控制、线程池、并发集合、线程间通信以及并发编程中常见的问题和解决方案。学习和熟练掌握这些内容对于开发高效的多线程Java...

    Java多线程详解及示例

    Java多线程编程是提升程序性能和响应性的关键技术。理解多线程的概念,掌握线程的创建、同步、通信、死锁避免等核心知识点,以及合理使用线程池,对于编写高效、稳定的并发程序至关重要。通过实践,开发者可以更好地...

    Java多线程详解(超详细)_狂神说笔记完整版_项目代码_适合小白随课程学习

    Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...

    java多线程设计模式详解(PDF及源码)

    (注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...

    JAVA多线程模型详解

    本文将深入探讨Java多线程模型的相关知识点,包括线程与进程的区别、线程的实现原理、线程的创建方法以及线程的阻塞与唤醒机制等,旨在为初学者提供一个清晰的多线程概念理解和使用指南。 一、线程与进程的区别 在...

    【JAVA基础】JAVA多线程编程详解

    【JAVA基础】JAVA多线程编程详解 Java多线程编程是Java开发中不可或缺的一部分,它允许多个任务在同一时间并发执行,提高了程序的效率和响应性。在Java中,线程是程序中的执行流,每个线程都有独立的执行控制,由...

    JAVA多线程编程详解-详细操作例子

    JAVA多线程编程详解-详细操作例子JAVA多线程编程详解-详细操作例子

    java多线程详解

    ### Java多线程详解:深度探索Java线程机制 #### 知识点一:线程与进程的区别 在深入探讨Java多线程之前,我们首先需要理解线程与进程的基本概念及其区别。进程是资源分配的基本单位,拥有独立的内存空间,而线程...

    JAVA多线程编程详解

    ### JAVA多线程编程详解 #### 一、深入理解多线程 多线程机制是现代编程语言中处理并发操作的关键技术之一,尤其在Java中,多线程提供了高效的资源利用方式,允许程序中多个指令流同时运行,提高程序执行效率。每...

    java多线程机制 详解

    Java的多线程机制是Java语言的一大特性,它允许程序同时执行多个任务,提升程序响应速度,优化资源利用率。在Java中,线程是程序执行的最小单位,一个进程可以包含多个线程,每个线程都有自己独立的生命周期,包括...

    java多线程编程详解

    在"JAVA多线程编程详解-详细操作例子.doc"和"Java多线程编程详解.doc"文档中,你应该能找到关于以上知识点的具体示例和深入解释,包括如何创建线程、线程间的通信(如wait/notify机制、Semaphore、CountDownLatch)...

    java多线程详解(比较详细的阐述了多线程机制)

    总之,Java多线程是构建高性能并发应用的基础,理解并掌握线程的创建、同步、通信、协作模式以及异常处理,对于编写高效、稳定的Java程序至关重要。在实际开发中,结合Java提供的工具和设计模式,能够更好地解决多...

    java 多线程 同步详解

    Java多线程同步详解 在Java编程中,多线程是一种常见的并发执行方式,它可以提高程序的执行效率,充分利用CPU资源。然而,多线程环境下数据的安全性问题不容忽视,这就引出了Java中的同步机制。本文将深入探讨Java...

    Java 多线程编程详解.pdf

    总之,《Java多线程编程详解》这份PDF文档全面覆盖了Java多线程编程的核心内容,无论你是初学者还是有经验的开发者,都能从中受益。通过学习,你可以更好地理解和掌握如何在Java中有效地利用多线程,提升程序的性能...

    JAVA多线程编程详解-详细操作例子(转自CSDN)

    总之,Java多线程编程涉及线程的创建、同步、通信以及异常处理等多个方面,理解和熟练掌握这些知识点是编写高效并发程序的基础。在实际开发中,应根据项目需求和性能优化选择合适的多线程实现策略。

Global site tag (gtag.js) - Google Analytics