转帖:
http://developer.51cto.com/art/200906/128232.htm
讲得不错,正适合现在的运用,谢谢作者!
一 线程的基本概念
线程是一个程序内部的顺序控制流.一个进程相当于一个任务,一个线程相当于一个任务中的一条执行路径.;多进程:在操作系统中能同时运行多个任务(程序);多线程:在同一个应用程序中有多个顺序流同时执行;Java的线程是通过java.lang.Thread类来实现的;JVM启动时会有一个由主方法(public static void main(){})所定义的线程;可以通过创建Thread的实例来创建新的线程;每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体,通过调用Thread类的start()方法来启动一个线程。
二 线程的创建和启动
可以有两种方式创建新的线程:
第一种:
1.定义线程类实现Runnable接口
2.Thread myThread = new Thread(target); //target为Runnable接口类型
3.Runnable中只有一个方法:public void run();用以定义线程运行体
4.使用Runnable接口可以为多个线程提供共享的数据
5.在实现Runnable接口的类的run()方法定义中可以使用Thread的静态方法public static Thread currentThread();获取当前线程的引用
第二种:
1.可以定义一个Thread的子类并重写其run方法如:
class MyThread extends Thread {
public void run() {...}
}
2.然后生成该类的对象:
MyThread myThread = new MyThread();
三 线程控制的基本方法
isAlive():判断线程是否还"活"着
getPriority():获得线程的优先级数值
setPriority():设置线程的优先级数值
Thread.sleep():将当前线程睡眠指定毫秒数
join():调用某线程的该方法,将当前线程与该线程"合并",即等待该线程结束,再恢复当前线程的运行
yield():让出cpu,当前线程进入就绪队列等待调度
wait():当前线程进入对象的wait pool
notify()/notifyAll():唤醒对象的wait pool中的一个/所有等待线程
四 线程同步
实现生产者消费者问题来说明线程问题,举例如下所示:
/**
* 生产者消费者问题
*/
package com.basic.thread;
/**
* @author johnston678
*
* @version 2009-05-06
*/
public class ProducerConsumer {
/**
* @param args
*/
public static void main(String[] args) {
ProductBox pb = new ProductBox();
Producer p = new Producer(pb);
Consumer c = new Consumer(pb);
Thread pThread = new Thread(p);
Thread cThread = new Thread(c);
pThread.setPriority(Thread.MAX_PRIORITY);
pThread.start();
cThread.start();
}
}
/**
* 产品对象
* @author johsnton678
*/
class Product {
int id;
public Product(int id) {
super();
this.id = id;
}
public String toString(){
return "Product:" + id;
}
}
/**
* 产品盒对象
* @author johnston678
*/
class ProductBox {
Product[] productbox = new Product[6];
int index = 0;
public ProductBox() {
super();
}
public synchronized void push(Product p) {
while (index == productbox.length) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify();
productbox[index] = p;
index ++;
}
public synchronized Product pop() {
while (index == 0) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.notify();
index --;
return productbox[index];
}
}
/**
* 生产者
* @author johnston678
*/
class Producer implements Runnable {
ProductBox productbox = null;
public Producer(ProductBox productbox) {
super();
this.productbox = productbox;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i=0; i<10; i++) {
Product p = new Product(i);
productbox.push(p);
System.out.println("produce:" + p);
try {
Thread.sleep((int)(Math.random() * 200));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 消费者
* @author johnston678
*/
class Consumer implements Runnable {
ProductBox productbox = null;
public Consumer(ProductBox productbox) {
super();
this.productbox = productbox;
}
@Override
public void run() {
// TODO Auto-generated method stub
for (int i=0; i<10; i++) {
Product p = productbox.pop();
System.out.println("consume:" + p);
try {
Thread.sleep((int)(Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
### CoreJava多线程学习总结 #### 一、基本概念 多线程是现代软件开发中非常重要的一个概念,尤其在Java这样的高级编程语言中,它使得程序能够更高效地利用计算机资源,实现并发处理任务。为了更好地理解CoreJava...
### 多线程学习必看知识点 #### 一、引言与问题提出 在软件开发领域,特别是对于那些需要处理大量数据或者长时间运行的任务时,单线程的应用程序往往会出现性能瓶颈,导致用户体验下降。例如,在一个单线程程序中...
总结来说,Java多线程学习和FTP上传结合,可以帮助我们构建高效、可控的文件上传服务。通过线程池,我们可以更好地管理并发任务,优化资源使用,提高FTP上传的性能。学习这些内容对于Java开发者尤其重要,尤其是在...
jsp多线程学习教程源码,有兴趣的看看啊,不足的地方还见谅啊
学习多线程编程时,不仅要掌握理论知识,还需要通过实践来理解和解决问题,例如通过编写多线程程序来模拟生产者消费者问题、哲学家就餐问题等经典并发问题。提供的压缩包"Multi-thread Program Tutorials"可能包含了...
但是,对于初学者来说,理解单线程阻塞模型是学习网络编程的基础,有助于深入理解Socket通信的工作原理。 此外,源码分析可以帮助我们更好地理解Socket通信的细节,例如异常处理、连接超时、资源管理等。通过阅读和...
首先,让我们看看线程如何访问全局变量。在Python中,一个进程内的所有线程共享全局变量。例如,在提供的代码段中,`g_num`就是一个全局变量,`test`函数通过`global`关键字声明并访问它。当两个或更多线程同时修改...
本项目以".NET线程学习代码"为主题,旨在帮助开发者理解和掌握.NET环境下的多线程编程技术。下面将详细探讨相关知识点。 首先,线程在.NET中的创建有两种主要方式:通过`System.Threading.Thread`类的实例化或使用`...
首先,我们来看`thread.h`文件。这个头文件通常包含了线程类的定义,以及与线程相关的常量、结构体和函数声明。在Nachos中,线程ID可能是用整数或者自定义的数据结构来表示的。线程ID用于唯一标识系统中的每个线程,...
首先,我们来看多线程的基本概念。线程是操作系统分配处理器时间的基本单位,一个进程可以包含一个或多个线程。在单线程环境下,程序按照顺序执行;而在多线程环境下,多个线程可以并发执行,使得程序能够并行处理多...
首先,我们来看"控制台和WinForm的并行访问"。在.NET 2.0中,你可以使用System.Threading命名空间下的Thread类来创建和管理线程。在控制台应用中,多线程可以用于执行耗时的任务,而不阻塞主线程。而在WinForm应用中...
总的来说,“C#打字游戏”项目提供了一个很好的学习多线程编程的机会。通过分析和实现这个游戏,开发者不仅能掌握如何创建和管理线程,还能理解如何在多线程环境中处理数据同步、异常和资源管理。这是一个实用且有趣...
首先,我们来看自定义线程池方法实现线程数控制的例子。线程池(ThreadPool)是Java并发编程中非常重要的概念,它能有效地管理和调度线程,避免过多线程导致的系统资源消耗。在`MaxThreadCountTest`中,开发者可能...
在IT行业中,线程是操作系统分配处理器时间的基本单位,它允许程序并发地执行多个任务。在单线程和多线程服务端应用系统中,...通过深入学习和实践,我们可以更好地利用线程这一工具,构建出高效、稳定的服务器应用。
本文将深入探讨MFC如何支持多线程,并基于标题"vc多线程-mfc-大家可以看看"及描述"vc多线程-mfc-大家可以看看这是第二部分"来阐述相关知识点。 首先,理解多线程的概念是至关重要的。多线程是指在一个进程中...
现在,我们来看如何实现一个线程查看软件。`processthreadsview_veryhuo` 文件可能是一个线程查看器的应用程序示例。线程查看器可以帮助开发者监控应用程序中的线程,观察它们的状态(如运行、等待、挂起等),以及...
在压缩包文件"MultThread"中,可能包含了实现上述线程间通信方式的示例代码和教程,通过学习和实践,你可以更深入地理解MFC线程间通信的原理和应用。建议逐步分析和运行这些示例,以巩固理论知识并提升实际操作技能...
从提供的文件列表来看,“ThreadSwitch”可能是示例项目的名称,而“ThreadSwitch.sln”是Visual Studio的解决方案文件,包含项目配置和依赖项信息。通过分析这个项目,我们可以更深入地了解线程切换的实际应用和...