Java线程入门教程 mingjava [原作]
来源:互联网 发布:网络教育统考有作弊吗 编辑:程序博客网 时间:2024/04/30 23:35
线程是Java的内嵌特性,线程并不容易掌握,有专门介绍Java线程的书籍,读者可以参考。由此可见Java线程的重要性,本文将详细介绍线程的基本知识。
有的时候你可能想写一个程序,每隔一段时间执行相关的任务,这个时候你可以使用Timer和TimerTask,非常方便。你可以参考http://blog.csdn.net/mingjava/archive/2004/07/04/33749.aspx。
在Java中实现一个线程有两种方法,第一是实现Runnable接口实现它的run()方法,第二种是继承Thread类,覆盖它的run()方法。下面是代码示例:
public class DoSomething implements Runnable {
public void run(){
// here is where you do something
}
}
public class DoAnotherThing extends Thread {
public void run(){
// here is where you do something
}
}
这两种方法的区别是,如果你的类已经继承了其它的类,那么你只能选择实现Runnable接口了,因为Java只允许单继承的。
Java中的线程有四种状态分别是:运行、就绪、挂起、结束。如果一个线程结束了也就说明他是一个死线程了。当你调用一个线程实例的start()的方法的时候,这个时候线程进入就绪状态,注意并不是运行状态,当虚拟机开始分配给他CPU的运行时间片的时候线程开始进入运行状态,当线程进入等待状态,例如等待某个事件发生的时候,这时候线程处于挂起状态。
启动一个线程你只需要调用start()方法,针对两种实现线程的方法也有两种启动线程的方法,分别如下:
DoSomething doIt = new DoSomething();
Thread myThread = new Thread( doIt );
myThread.start();
DoAnotherThing doIt = new DoAnotherThing();
doIt.start();
由于安全等因素Thread中的stop()方法已经不推荐使用了,因此如果你想要停止一个线程的时候可以通过设置一个信号量,例如:
public class MyThread implements Runnable {
private boolean quit = false;
public void run(){
while( !quit ){
// do something
}
}
public void quit(){
quit = true;
}
}
如果每个线程只做它自己的事情,那么就很简单了,但是有的时候几个线程可能要同时访问一个对象并可能对它进行修改,这个时候你必须使用线程的同步在方法或者代码块使用关键字synchronized,例如:
public class Counter {
private int counter;
public synchronized int increment(){
return ++counter;
}
public synchronized int decrement(){
if( --counter < 0 ){
counter = 0;
}
return counter;
}
}
每个java对象都可以最为一个监视器,当线程访问它的synchronized方法的时候,他只允许在一个时间只有一个线程对他访问,让其他得线程排队等候。这样就可以避免多线程对共享数据造成破坏。记住synchronized是会耗费系统资源降低程序执行效率的,因此一定要在需要同步的时候才使用,尤其在J2ME的开发中要小心。如果你要是想让线程等待某个事件的发生然后继续执行的话,那么这就涉及到线程的调度了。在java中通过wait(),notify(),notifyAll()来实现,这三个方法是在Object类中定义的,当你想让线程挂起的时候调用obj.wait()方法,在同样的obj上调用notify()则让线程重新开始运行。
最后以SUN提供的Producer/Consumer的例子来结束这篇文章,内容是Producer产生一个数字而Consumer消费这个数字,这个小程序里面基本覆盖了本文所有的知识点。请详细研究一下代码
public class Producer extends Thread {
private CubbyHole cubbyhole;
private int number;
public Producer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}
public void run() {
for (int i = 0; i < 10; i++) {
cubbyhole.put(i);
System.out.println("Producer #" + this.number
+ " put: " + i);
try {
sleep((int)(Math.random() * 100));
} catch (InterruptedException e) { }
}
}
}
public class CubbyHole {
private int contents;
private boolean available = false;
public synchronized int get() {
while (available == false) {
try {
wait();
} catch (InterruptedException e) { }
}
available = false;
notifyAll();
return contents;
}
public synchronized void put(int value) {
while (available == true) {
try {
wait();
} catch (InterruptedException e) { }
}
contents = value;
available = true;
notifyAll();
}
}
public class Consumer extends Thread {
private CubbyHole cubbyhole;
private int number;
public Consumer(CubbyHole c, int number) {
cubbyhole = c;
this.number = number;
}
public void run() {
int value = 0;
for (int i = 0; i < 10; i++) {
value = cubbyhole.get();
System.out.println("Consumer #" + this.number
+ " got: " + value);
}
}
}
public class ProducerConsumerTest { public static void main(String[] args) { CubbyHole c = new CubbyHole(); Producer p1 = new Producer(c, 1); Consumer c1 = new Consumer(c, 1); p1.start(); c1.start(); }}
SUN说输出的结果应该是如下形式,但是在我的机器上却不是这样的,做了一些改动才正确,有兴趣的朋友可以运行一下看看结果,欢迎和我讨论一下!
Producer #1 put: 0
Consumer #1 got: 0
Producer #1 put: 1
Consumer #1 got: 1
Producer #1 put: 2
Consumer #1 got: 2
Producer #1 put: 3
Consumer #1 got: 3
Producer #1 put: 4
Consumer #1 got: 4
Producer #1 put: 5
Consumer #1 got: 5
Producer #1 put: 6
Consumer #1 got: 6
Producer #1 put: 7
Consumer #1 got: 7
Producer #1 put: 8
Consumer #1 got: 8
Producer #1 put: 9
Consumer #1 got: 9
Java线程入门教程 |
介绍J2ME中的通用联网框架 |
如何学好J2ME |
使用Canvas制作MIDlet的欢迎界面 |
使用ANT协助开发java项目 |
- Java线程入门教程 mingjava [原作]
- Java线程入门教程
- Java线程入门教程 - zt
- Java线程入门教程
- Java线程入门教程 详细
- java入门教程-7.1Java线程的概念
- java入门教程-7.2Java线程模型
- java入门教程-7.7Java线程优先级
- java入门教程-7.8Java线程同步
- java入门教程-7.9Java线程间通信
- java入门教程-7.10Java线程死锁
- Java中的事务处理 dengzi725 [原作]
- Java中的事务处理 dengzi725 [原作]
- JAVA编程规范 chensheng913 [原作]
- Delphi中的线程类(原作 Raptor)
- java入门教程-7.11Java线程的挂起、恢复和终止
- 细说Java之util类[asklxf 原作]
- c# 线程入门教程,详解
- 《IT时代周刊》:WAPI,中国能顶得住吗?
- 原来〈hr〉还有这个用处,直接用作虚线
- 神仙表
- 为什么在网页中使用alert("我是中国人");会谈出乱码
- XML Schema学习笔记(一)
- Java线程入门教程 mingjava [原作]
- view的优化(其实就是表连接的问题)
- 关于ROWID分页中,执行计划的错误选择与处理(二)
- 从文档中取出当前用户的岗位和职责
- Attribute在.net编程中的应用(一)
- 支持全国纪念九一八!支持设立国耻日!爱国的都快来签名呀!!!!!!!!!!!!!!!!!!!!
- 男人是这样长大的
- Attribute在.net编程中的应用(二)
- Attribute在.NET编程中的应用(三)