浅析Java多线程程序设计机制-Java基础-Java-编程开发
来源:互联网 发布:淘宝直通车在哪里 编辑:程序博客网 时间:2024/05/22 07:09
线程也是有状态和声明周期的,每个Java程序都会有一个缺省的主线程,对于应用程序applcation来说main方法就是一个主线程.Java语言使用的是Thread类及其子类的对象来表示线程的.创建一个新的线程的生命周期如下状态:
1) 新建:当一个Thread类或者其子类的对象被声明并创建时,新的线程对象处于新建状态,此时它已经有了相应的内存空间和其他资源.
2) 就绪:处于新建状态的线程被启动后,将进入线程队列排队等待CUP服务,这个时候具备了运行的条件,一旦轮到CPU的时候,就可以脱离创建它的主线程独立开始自己的生命周期.
3) 运行:就绪的线程被调度并获得CUP的处理边进入了运行状态,每一个Thread类及其子类的对象都有一个重要的run()方法,当线程对象被调度执行的时候,它将自动调用本对象的run()方法,从第一句代码开始执行。所以说对线程的操作应该写到run()方法中.
4) 阻塞:一个正在执行的线程如果再某种情况下不能执行了.进入阻塞状态,这个时候它不能进入排队状态,只有引起了阻塞的原因消失的时候,线程才可以继续进入排队状态等待CUP处理。
5) 死亡:处于死亡状态的线程不具有继续执行的能力,线程死亡主要的原因是正常运行的线程完成了全部工作,即执行完了run()方法,另外就是被提前强制的终止了。
线程的调度也是有优先级别的,就是说同样的排列优先级高可以提前被CPU处理,主要分三个级别,高中低.分别代表的数字是10.5.1分别有三个常量代表不可以被改变。最小优先级的常量是MIN_PRIORITY,普通的优先级的常量是NORM_PRIORITY,最高的优先级的常量是MAX_PRIORITY一般主线程的优先级是普通,另外可以通过Thread类的setPriority(int a)方法来修改系统自动设置的线程优先级。
Java中编程实现多线程应有两种途径,一种是创建自己的线程子类,另外是实现一个接口Runnable。无论是那种途径最终读需要使用Thread类及其方法。Thread类有两种构造方法,public Thread()用来创建一个线程对象。public Thread(Runnable r)创建线程对象,参数r成为被创建的目标对象。这个目标必须实现Runnbale接口,给出该接口的run()方法的方法体,再方法体中操作.用两个构造方法创建完的线程就是一个新建的状态,等待处理.然后启动线程的start()方法,启动线程对象,线程进入排队状态也就是就绪状态.然后线程操作run()方法这个方法里的内容是被系统处理的内容.如果想使线程进入休眠状态可以调用sleep()方法,可以给一个参数,代表休眠的毫秒.如果给两个参数代表那秒。终止线程用yield()方法来完成.判断线程是否销毁可以用idAlive()方法判断线程是否活着。Runnable接口只有一个方法run()方法,我们实现这个接口把要操作的代码写到这个方法中,然后再把实现了整个接口的类的实例传给Therad类的构造方法即可操作线程。
线程同步是一个再处理线程的时候需要注意的问题,同步方法要用synchronized关键字类修饰,被这个关键字修饰后,当一个线程A使用这个方法后,其它线程想使用这个方法就必须等待,知道线程A使用完该方法后方可使用.下面我写一个例子来说明线程同步,这个例子有两个线程会计和出纳,他们共同有一个账本.他们俩都可以存取方法对账本进行访问,会计使用存取方法的时候写入存钱的记录,出纳则写入取钱的记录。因此会计使用账本的时候出纳被禁止使用,反之也是如此。就是一个人使用另外一个人必须等待。下面我通过一个小程序Applet来实现这个事:
import Java.applet.*;
import Java.awt.*;
import Java.awt.event.*;
public class MyThread extends Applet implements Runnable {
int money = 100;
TextArea text1 = null;
TextArea text2 = null;
Thread Kuaiji = null;
Thread Chuna = null;
public void init() {
Kuaiji = new Thread(this);
Chuna = new Thread(this);
text1 = new TextArea(20,8);
text2 = new TextArea(20,8);
add(text1);
add(text2);
}
public void start() {
Kuaiji.start();
Chuna.start();
}
public synchronized void Cunqu(int number) {
if(Thread.currentThread() == Kuaiji) {
for(int i=1;i <=3;i ) {
money = money number;
try {Thread.sleep(1000);}
catch(Exception e){}
text1.append("/n" money);
}
}
else if(Thread.currentThread() == Chuna) {
for(int i=1;i <=2;i ) {
money = money - number/2;
try {Thread.sleep(1000);}
catch(Exception e){}
text2.append("/n" money);
}
}
}
public void run() {
if(Thread.currentThread()==Kuaiji || Thread.currentThread()==Chuna) {
for(int i=1;i <=3;i ) {
Cunqu(30);
}
}
}
}
- 浅析Java多线程程序设计机制-Java基础-Java-编程开发
- 浅析Java多线程程序设计机制
- Java多线程程序设计入门-Java基础-Java-编程开发
- 浅析Java多线程编程中的高级技术-Java基础-Java-编程开发
- Java Applet程序设计基础-Java基础-Java-编程开发
- Java打印程序设计全攻略-Java基础-Java-编程开发
- Java 5.0 多线程编程实践-Java基础-Java-编程开发
- java开发多线程机制
- java开发多线程机制
- Eclipse Form程序设计快速入门-Java基础-Java-编程开发
- Java多线程编程基础
- Java多线程编程基础
- Java基础-多线程编程
- Java 多线程编程基础
- java多线程开发基础
- java多线程开发基础
- java多线程开发基础
- Web Service安全机制探讨-Java基础-Java-编程开发
- Java在Client/Server网络中的应用-Java基础-Java-编程开发
- 用Javap反编译帮你理解Java特性-Java基础-Java-编程开发
- 揭开Java 安全标准的神秘面纱-Java基础-Java-编程开发
- 用Java实现回调例程-Java基础-Java-编程开发
- 理解Java面向对象的程序设计思想-Java基础-Java-编程开发
- 浅析Java多线程程序设计机制-Java基础-Java-编程开发
- 将Java程序变成Windows系统服务-Java基础-Java-编程开发
- Java初学者需掌握的30个基本概念-Java基础-Java-编程开发
- 面向Java程序员的Ajax:构建动态Java程序-Java基础-Java-编程开发
- JDBC 入门-Java基础-Java-编程开发
- 浅析Java语言中两种异常的差别-Java基础-Java-编程开发
- Java Servelet API入门基础教程-Java基础-Java-编程开发
- Java Servlet 编程及应用之五-Java基础-Java-编程开发
- Java Servlet 编程及应用之三-Java基础-Java-编程开发