创建、启动线程有两种方式
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多线程的基础概念和关键技术点。首先解释了线程的基本概念、线程与进程的区别及其不同状态。接着,通过三种方式创建线程(继承Thread类、实现Runnable接口、使用Callable和Future接口)...
### Java多线程编程详解:深入理解与实践 #### 一、理解多线程机制 多线程,作为现代编程语言的重要特性之一,允许在单一应用程序内并发执行多个任务,从而极大提升了程序的效率和响应速度。在Java中,多线程的...
以上是对"Java多线程详解"主题的详细阐述,涵盖了Java多线程的基本概念、实现方式、线程控制、线程池、并发集合、线程间通信以及并发编程中常见的问题和解决方案。学习和熟练掌握这些内容对于开发高效的多线程Java...
Java多线程编程是提升程序性能和响应性的关键技术。理解多线程的概念,掌握线程的创建、同步、通信、死锁避免等核心知识点,以及合理使用线程池,对于编写高效、稳定的并发程序至关重要。通过实践,开发者可以更好地...
Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...
(注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...
本文将深入探讨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编程中,多线程是一种常见的并发执行方式,它可以提高程序的执行效率,充分利用CPU资源。然而,多线程环境下数据的安全性问题不容忽视,这就引出了Java中的同步机制。本文将深入探讨Java...
总之,《Java多线程编程详解》这份PDF文档全面覆盖了Java多线程编程的核心内容,无论你是初学者还是有经验的开发者,都能从中受益。通过学习,你可以更好地理解和掌握如何在Java中有效地利用多线程,提升程序的性能...