线 程
前面我们所给出的程序例子,基本都是单线程的,即一个程序只有一条从头到尾的执行路线,然后在程序设计中,很多的时候,我们需要编写具有多线程的程序。这也就是今天要给大家说的线程的问题了。
多现成是指同时存在几个执行体,按几条不同的执行路线共同工作的情况。Java语言中,有一个重要的功能特点就是它的内置对多线程的支持,它使的变成人员可以很方便地开发出具有多线程功能,能同时处理多个任务的功能强大的应用程序。
一 .Java线程的几个概念
1)程序,进程与线程的关系 程序是一段静态的代码,它是应用软件执行的根本。 进程是程序的一次动态执行过程,它对应了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到消亡的过程。做为执行蓝本的同一段程序,可以被加载到系统的不同内存区域分别执行,形成不同的进程。 线程是比进程更小的执行单位。一个进程在其执行过程能够中,可以产生 多个线程,形成多条执行线索。每条线索,即每个线程也有它自身的产生、存在和消亡过程,也是一个动态的概念。
2)线程的转台与生命周期 每个Java程序都有一个缺省的主线程,对于Application,主线程是main()方法执行的线索,对于Applet,主线程指挥浏览器加载并执行Java小程序。要想实现多线程,必须在主现成中创建新的现成对象。Java语言使用Thread类及其自类的对象来表示线程,新建的线程在它的一个完整的生命周期中通常要经历如下的五种状态: 新建:新生的线程对象出新建状态,此时,它已经有了相应的内存空间和其他资源,并已经被初始化。 就绪:处于新建状态的线程被启动后,将进入线程队列排队等待CPU时间片,此时它已经具备了运行的条件。一旦轮到它来享用CPU资源时,它就可以脱离创建它的主线程而单独开始自己的生命周期了。另外,原来处于阻塞状态的线程被接触阻塞后也将进入就绪状态。 运行:当就绪状态的线程被调度并获得处理器资源时,便进入运行状态。 阻塞:一个正在执行的线程在某些特殊情况下,让出CPU并暂时终止自己的执行,进入睡眠状态。 死亡:处于死亡状态的纤尘不具有继续运行的能力。线程死亡的原因有两个:一个是正常运行的现成完成它的全部工作后退出。另外的一个则是线程提前强制性地终止,如通过执行stop()方法或destroy()来终止线程。
好了,说了这么多,还是给大家举几个例子,配合例子给大家讲讲线程的始末吧!
二 .Java线程的例子
|
这个例子只是向大家说明在系统的内部,两个毫不干涉的线程个自执行的情况。从这个例子可以看到每个现成各自执行了多少次!
点击这儿查看源代码及解释 |
一个时钟的例子
源代码如下: import java.awt.*;
import java.applet.*;
import java.util.Date; //这是Java中的低级实用工具包,可以处理时间等内容。
public class Applet1 extends Applet implements Runnable //有线程运行接口
{
Date timenow; //Date是一个时间定义与创建函数.
Clock myClock; //用户自定义的类
Thread clockthread=null; //设置一个线程
public void start() //线程开始的类
{
if (clockthread==null) //如果线程为空,则
{
clockthread=new Thread (this); //开始新的线程
clockthread.start(); //开始
}
}
public void stop() //终止线程
{
clockthread.stop(); //终止线程,使它
clockthread=null; //为空
}
public void run() //运行线程
{
while(true) //一个死循环,条件永远都是真的。
{
repaint(); //重新绘制界面
try{Thread.sleep(1000);} //让线程沉睡1000毫秒,也就是一秒钟
catch(InterruptedException e){} //捕获异常(也就是错误)
}
}
public void paint(Graphics g)
{
timenow=new Date(); //新的时间的获得
//获得小时,分钟,秒钟
myClock=new Clock(timenow.getHours (),
timenow.getMinutes (),
timenow.getSeconds ());
g.drawString(timenow.toString(),25,240);//将它打印出来!
myClock.show(g,100,100,100); //使面板显示
}
}
class Clock //用户自定义的类开始,编译后,它单独成为一个CLASS文件
{
Clock(int hrs,int min,int sec) //类函数入口
{
hour=hrs; //将原始数据处理,得到小时
minute=min; //将原始数据处理,得到分钟
second=sec; //将原始数据处理,得到小时
}
void show(Graphics g,int cx,int cy,int rad) //重新定义SHOW函数
{
int hrs_len=(int)(rad*0.5), //时针的长度
min_len=(int)(rad*0.6), //分钟的长度
sec_len=(int)(rad*0.9); //秒钟的长度
double theta;
//画出钟面
g.drawOval(cx-rad,cy-rad,rad*2,rad*2);
//画出时针
theta=(double)(hour*60*60+minute*60+second)/43200.0*2.0*Math.PI ;
drawNiddle(g,Color.blue,cx,cy,hrs_len,theta);
//画出分针
theta=(double)(minute*60+second)/3600.0*2.0*Math.PI ;
drawNiddle(g,Color.red,cx,cy,sec_len,theta);
//画出秒针
theta=(double)(second)/60.0*2.0*Math.PI ;
drawNiddle(g,Color.green ,cx,cy,sec_len,theta);
}
private void drawNiddle(Graphics g,Color c,int x,int y,int len,double theta)
{
int ex=(int)(x+len*Math.sin(theta));
int ey=(int)(y-len*Math.cos(theta));
g.setColor (c);
g.drawLine(x,y,ex,ey);
}
int hour,minute,second;
}
|