您的位置:首页 > 编程语言 > Java开发

学习笔记 java 多线程(二)

2012-04-21 11:54 543 查看
Thread类

Thread类为创建线程的构造方法、以及控制线程的方法

java.lang.Thread implements java.lang.Runnable

Thread()创建一个空线程
Thread(task:Runnable)为制定任务创建一个线程
start()void启动线程是方法run被jvm调用
isAlive():bollean测试线程当前是否正在运行
setPreority(P:int):void设置线程的优先级p(从1 到10)
join()void等待线程结束
sleep(millis : long):void使线程睡眠指定的毫秒数
yeild():void使线程暂停并允许执行其他线程
interrupt():void中断线程
因为Thread类实现了 Runnable接口,所以可以定义一个Thread类的扩展类,并实现run方法,然后在客户端中创建这个类的对象,并调用他的start()方法来启动线程。但是不推荐这种使用方法,因为将任务和运行任务的机制混在一起了。将任务从线程中分离出来时比较好的设计。

class MyThread extends Thread{
@Override
public void run(){
System.out.print("测试");
}
}


MyThread thread4 = new MyThread();
thread4.start();


Thread类还包含方法stop()、suspend()、和resume()方法 。但是,由于普遍认为这些法能够发法存在不安全因素。所以、在java 2中不提倡这些方法。为替代法 stop()的使用,可以通过给Thread变脸赋值 null 来表明它被停止。

使用yield()方法可以使当前线程为其他线程临时让出cpu时间。

要知道,我们自己创建的线程一般附加在main主线程或者我们自己创建的其他线程之中,myThread。oin()方法可使主线程等待当myThread 执行完毕。 也就是说 使用join()方法使一个线程,等待另一个线程执行完毕后再执行自己。



第一篇的实例 TaskThreadDemo 中 如果我想 等到 所有的打印任务技术后 打印一段文字“执行完毕”,如果我直接在main方法中编写打印代码,那么就会事与愿违,“执行完毕”很可能会和 字符和数字混在一起。我可以利用join方法做到这一点。

package LianXi;
public class TaskThreadDemo{
public static void main(String[] args){
PrintChar printC = new PrintChar('C',1000);
PrintChar printX = new PrintChar('X',1000);
PrintNum printNum = new PrintNum(1000);

Thread thread1 = new Thread(printC);
Thread thread2 = new Thread(printX);
Thread thread3 = new Thread(printNum);
thread1.start();
thread2.start();
thread3.start();
try{
thread1.join();
thread2.join();
thread3.join();
} catch (InterruptedException ex) {

}
System.out.println("\n main方法中输出的");
}
}

class PrintChar implements Runnable{
private char _charToPrint;
private int _times;

public PrintChar(char c,int t){
_charToPrint = c;
_times = t;
}

public void run(){
for(int i = 0 ;i <_times; i++){
System.out.print(_charToPrint);
Thread.yield();
}
}
}

class PrintNum implements Runnable{
private int _lastNum;

public PrintNum(int lastNum){
_lastNum = lastNum;
}

public void run(){
for(int i = 0; i<=_lastNum; i++){
System.out.print(i);
//Thread.yield();
}
}
}


java 给每一个线程指定一个优先级。默认情况下,线程继承生成它的线程的优先级。可以用setPriority(priority)方法提高或者降低一个线程的优先级。还能还用getPriority()方法获得一个线程的优先级。优先级是从1到10的数字。Thread类中有int常量 MIN_PRIORITY 、NORM_PRIORITY 和MAX_PRIORITY、分别代表1、5 和10.主线程的优先级是 NORM_PRIORITY.

java虚拟机,总是选择当前优先级高的可运行线程。较低优先级的线程只有在没有比它高的优先级的线程运行时才能运行。如果所有线程具有同样的优先级,j将会用循环列队为他们分配相同的vpu份额。这被称为循环调度。

GUI事件分发线程

GUI事件处理和绘图代码在一个被成为事件分发线程的特殊线程中执行。由于大多数的Swing方法都不是线程安全的,因此在多线程中调用它们可能导致冲突。在某些情况下,需要在实践分发线程中运行代码。以避免冲突的发生。可以使用java。swing。SwingUtillities类中的静态方法invokeLatter和invokeAdnWate方法来运行事件分发线程的代码。必须将这些代码放到Runnable对象的run方法中。并且将Runnalbe对象指定为invokelatter或者invokeAndWait方法的参数。invokeLatter方法立即返回,无需等待时间分发线程执行的代码,而invokeAndWait需要等到事件分发线程的特定代码执行完毕之后才能返回。

作者:duanmengchao 发表于2012-4-21 11:54:21 原文链接

阅读:11 评论:0 查看评论
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: