所谓线程,是进程的一部分,一个线程可以单独的执行一项任务,比如一个客户机连接上服务器,我们就启动一个线程来管理这个用户,多个客户机就启动多个线程同时进行管理,线程之间可以进行信息的交换。
使用Java线程时,一般将线程视为一个对象,通常为类Thread对象,或者接口Runnable对象。但是无论是继承类Thread还是实现接口Runnable最终其实都要使用到Thread类及其方法。既然如此为什么我们不直接继承Thread,还需要Runnable的存在呢,原因是一般继承了Thread的类不能再继承其他类,但是实现接口Runnable是没有这个限制的。
通过以上分析,在JAVA中使用线程就很明了了,使用线程有俩种方法:
一、直接用一个类继承Thread类,调用该类的Start方法就可以启动线程
二、创建一个类实现接口Runnable,以该类的对象作为参数传递给Thread构造函数创建一Thread对象,调用Start方法就可以启动线程。
其实 Thread类有很多方法可以使用,常用的有以下几个
start():启动线程
stop():停止线程
sleep(int n):线程暂停n秒
run():调用start方法时该方法执行
在线程中用到比较多的还有关键字:synchronized。该关键字的作用是避免多个线程同时对某个数据对象进行进行访问,造成数据的混乱。
我们以生产者/消费者的例子来进一步了解一下线程
生产者:
import java.util.ArrayList;
public class Tproduct extends Thread{
private ArrayList<Apple> al;
public Tproduct(ArrayList al) {
this.al = al;
}
public void run() {
super.run();
int name = 0;
while (true) {
try {
synchronized (al) {
if (al.size() == 0) {
Apple c = new Apple("苹果" + name);
al.add(c);
System.out.println("收获一个" + c.name);
name++;
al.notify(); //如果收获一个苹果,就通知一下
} else {
}
}
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
消费者:
import java.util.ArrayList;
public class Tcustom extends Thread{
private ArrayList<Apple> al;
public Tcustom(ArrayList al) {
this.al = al;
}
public void run() {
super.run();
while (true) {
synchronized (al) {
if (al.size() > 0) {
Apple c = (Apple) al.remove(0);
System.out.println("吃了" + c.name);
} else {
// 如果没有苹果 就等待
try {
al.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
产品:
public class Apple {
public Apple(String name) {
this.name = name;
}
public String name;
}
程序执行:
import java.util.ArrayList;
public class Text {
private static ArrayList<Apple> al = new ArrayList<Apple>();
public static void main(String args[]) {
Tcustom tc = new Tcustom(al);
Tproduct tp = new Tproduct(al);
tc.start();
tp.start();
}
}
以上程序中使用了俩个线程,分别模拟生产者和消费者,不停的进行生产和消费。每生产一个产品就消费掉他,使用同步避免了俩个线程对数组队列同时访问。
分享到:
相关推荐
浅谈Java线程的生命周期——北大青鸟佳音旗舰.docx
主要介绍了浅谈java线程join方法使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
下面小编就为大家带来一篇浅谈Java线程间通信之wait/notify。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本篇文章主要介绍了浅谈Java线程Thread.join方法解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
下面小编就为大家带来一篇浅谈java线程中生产者与消费者的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
浅谈JAVA中多线程的实现
浅谈Java多线程编程.pdf
主要介绍了Java线程Thread之interrupt中断解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
浅谈Java的多线程机制.pdf
本文主要对Java线程并发的知识点进行简单介绍。具有很好的参考价值,需要的朋友一起来看下吧
浅谈JAVA中多线程的实现.pdf
浅谈JAVA语言的多线程技术.pdf
主要介绍了浅谈Java多线程处理中Future的妙用(附源码),还是比较不错的,需要的朋友可以参考下。
本篇文章主要介绍了浅谈java中守护线程与用户线程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
主要介绍了浅谈java的守护线程与非守护线程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
浅谈《JAVA程序设计》中线程的教学.pdf
主要介绍了浅谈Java多线程编程中Boolean常量的同步问题,主要针对线程之间同步了不同的布尔对象的问题,需要的朋友可以参考下
下面小编就为大家带来一篇浅谈java多线程 join方法以及优先级方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
下面小编就为大家带来一篇浅谈java中异步多线程超时导致的服务异常。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧