副标题#e#
在进修java中,我发明有关于对线程的讲授较量少,我规划为一些java初学者提一些关于线程方面的参考,
为深入进修java奠基基本。我本着配合进步的原则特写下了关于java线程编程的一系列文章
java线程编程(一):线程基本
◆线程(thread)其实是节制线程(thread of control)的缩写.
每一个线程都是独立的,因此线程中的每个要领的局部变量都是和其他线程隔分开的,这些变量完全是私有的,因此对付
线程而言,是没有步伐会见其他线程的局部变量的。假如两个线程同时会见同一个要领,则每个线程获得一个单独的此要领的
局部变量的拷贝。
◆通过Thread类建设线程
public classs test{
public void run(){
for (int i;i<100;i++){
System.out.println("hello_"+i);
}
}
}
将会输出hello_0,一直到hello_99;
假如我们在Applet中挪用这个要领,他就会在Applet的线程中运行。
impot java.applet.Applet;
public class test extends Applet{
public void init(){
test tt=new test();
tt.run();
}
}
假如我们想让test的run()要领与applet的init()一起运行,该怎么做呢?
应该使test成为thread(java.lang.Thread)的子类.
措施修改为:
public classs test extends Thread{
public void run(){
for (int i;i<100;i++){
System.out.println("hello_"+i);
}
}
}
接下来我们还要修改Applet:
impot java.applet.Applet;
public class test extends Applet{
public void init(){
test tt=new test();
tt.start();
}
}
#p#副标题#e#
对ran()要领的挪用酿成了对start()要领的挪用。
对此我们做一些说明:
Thread
建设一个历程化的工具
void run()
新建设的线程会执行这个要领
void start()
建设一个新的线程并运行这个线程类中界说的run()要领。
下面我们来看一个例子
import java.awt.*;
public class TimerThread extends Thread{
Componet comp;//需要重画的组件
int timediff;//组件重画的隔断时间
volatile boolean shouldrun;//设为false为遏制线程
public TimerThread (Compond comp,int timediff){
this.comp = comp;
this.timediff = timedifff;
shouldrun = true;
}
public void run(){
while(shouldrun){
try{
comp.repaint();
sleep(timediff);
}catch(Exception e){}
}
}
}
sleep()要领是Thread类的一部门,他使恰当前线程遏制必然的时间。
static void sleep(long millseconds)
睡眠时间指定为毫秒
static void sleep(long millseconds ,int nanoseconds)
睡眠时间指定为毫秒和纳秒这个要领是静态的。
线程的遏制,一般不推荐利用
stop()要领,利用stop()要领是危险的,将会导致异常。
◆利用Runable接口的线程
java语言利用一种称为接口的机制,来办理其不支持的多重担任。
Runnable接口只利用一个要领run()要领.
public classs test implements Runnable{
public void run(){
for (int i;i<100;i++){
System.out.println("hello_"+i);
}
}
}
同时相应的措施修改为:
impot java.applet.Applet;
public class test extends Applet{
public void init(){
Runnable tt=new test();
Thread th= new Thread(tt);
th.start()´
}
}
◆线程周期
boolean isAlive()
用来判定一个线程是不是勾当的
线程启动并不料味着线程正在运行或可以运行了,这是这个原因
isAlive()才常常被用来检测线程是否正在运行。
简朴的一段小措施
...
while(timer.isAlive())
{
try{
Thread.sleep(100);
}catch(InterruptedException e){}
}
void jion()
期待指定的线程运行竣事
当线程不勾那时,jion()才会返回
void jion(long timeout)
期待指定的线程运行竣事,但不高出指定的超时值