首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

初识多线程二

2012-10-25 
初识多线程21.线程,进程,程序的区别程序:我们写的程序,不论是C、C++、JAVA还是其他的,其实都是一种文本,真正

初识多线程2
1.线程,进程,程序的区别
程序:我们写的程序,不论是C、C++、JAVA还是其他的,其实都是一种文本,真正运行、跑动的是进程。程序可以分为两个部分:源代码和可执行的二进制代码(经过汇编或编译)操作系统加载这个可执行的二进制代码后,还要分配相应的内核数据结构--进程控制块,进行一系列的初始化等过程后才创建了真正可以“跑动”的进程。所以程序相当于一个项目的计划书(或行动方案),而进程才是对该方案的实施过程。
进程:简单的来说,进程就是一个正在执行的程序,它的内部数据和状态都是完全独立的,每一个进程都从一个主线程开始执行,但可以在它所拥有的线程中创建额外的线程。
线程:同一个进程中的多个线程之间可以并发执行,线程是操作系统分配CPU运算时间的最小单位一个进程的所有线程共享进程的虚拟地址空间和系统资源,一个线程的资源包括线程的机器寄存器设置,内核堆栈,线程环境变量和
进程虚拟地址中的用户堆栈。
2.线程的创建方式
在java中,每个线程对象都是一个 继承了java.lang.Thread类的对象或implements java.util.Runnable接口的类的对象,线程的启动是通过调用线程对象的start()方法启动,线程运行是从线程对象的run()方法 开始,当线程对象的run()方法结束后,线程即运行结束。线程的创建,一般通过下面两种方法:通过继承Thread类实现线程:重写Thread类的run()方法,在run()方法中编写你的线程要实现的调用,然后创建该子类的实例,调用其start()方法启动线程;另一种方法是通过实现Runnable接口创建线程:定义一个实现Runnable接口的类,实现它的run()方法,然后将这个类的实例作为Thread的构造方法的参数,创建Thread类的实例,即可做为线程启动。查看Thread类的说明就会发现,它也是实现了Runnable接口的类。如下代码:
public class RunnableTest implements Runnable{
       public  static void main(String args[]){
       for(int i=0;i<100;i++){
       RunnableTest rt=new RunnableTest(t);//创建Runnable对象
       Thread th=new Thread(rt);//构造Thread对象
       th.start();//启动线程
       }
      }
   }
3.线程的监听模式
以弹球游戏为例
//小球监视线程
public class Listener implements Runnable{
    //定义数组属性
private ArrayList<Ball> list;
//重写构造方法,传递参数
public Listener(ArrayList<Ball> list) {
this.list=list;
}
    //重写run()方法
@Override
public void run() {
//判断小球是否停止
while(!Ball.isStop){
//判断小球是否暂停
while(!Ball.isPause){
//遍历数组
for(int i=0; i<list.size()-1;i++){
    //创建小球对象
Ball b=list.get(i);
Ball b1=list.get(i+1);
}//处理异常
try{
Thread.sleep(1);//调用sleep方法,使线程进入阻塞状态
}catch(Exception ef){
ef.printStackTrace();
}
  }
      }

}

}在ActionListener监听器类中需要同步监听
//定义内部监听器类
ActionListener al=new  ActionListener() {
//重写方法
public void actionPerformed(ActionEvent e) {
//得到指令
String command=e.getActionCommand();
if(command.equals("开始")){
Ball.initBall();
//创建Runnable对象
Listener l=new Listener(list);
Thread th=new Thread(l);//创建Thread对象
th.start();//启动线程
Ball b=new Ball(jp);//创建小球对象
b.start();//启动线程
list.add(b);//将小球对象添加到数组中
Ball b1=new Ball(jp);
b1.start();
list.add(b1);
jb.setText("暂停");//将按钮转换成暂停状态
}
if(command.equals("暂停")){
         Ball.PauseBall();
jb.setText("继续");
}
                    if(command.equals("继续")){
Ball.resumeBall();
jb.setText("暂停");
}
if(command.equals("停止")){
Ball.stopBall();
jt.setText("开始");
}
}
};

4.线程的控制
执行线程程序时,会感觉到机器非常慢。打开任务管理器就会发现,CPU的占用率是100%;这是因为我们的线程在循环时,一直在占用CPU资源--没有一点时间让给其它程序,这是不合理的。在应用设计中,如果一个线程要长时间循环执行某一个任务,就有必要让线程隔一段时间暂停一下,Thread类提供了一个静态方法sleep(long time),在线程运行时,调用这个方法,可以让线程暂停time指定的时间后再开始运行,即使系统中没有其他可运行的线程,处于sleep中的线程也不会运行,暂停的单位以毫秒计,即千分之一秒。Thread.sleep(long time)方法只会让被调用的线程暂停(挂起),进入阻塞状态,而不是停止,也不是退出,这个时间段一过,线程对象又会被VM调度到sleep状态。当线程在sleep状态时,如果VM或其它线程强行终止这个线程,sleep方法会抛出异常,这叫作线程终止异常,因此在调用sleep方法时,需要处理这个异常:
用try catch方法
try{
Thread.sleep(long time);
}catch(Exception ef){
ef.printStackTrace();
}

热点排行