posts - 17,  comments - 14,  trackbacks - 0

多线程:减轻编写交互频繁、涉及面多的程序的难度;充分利用计算机资源。

      一个操作系统,可以有多个进程,每个进程上边会有多个线程。一个程序的运行至少启动两个线程:main线程和gc(守护)线程。

线程分为前台线程和后台线程(守护线程):

对Java程序来说,只要有一个前台线程在运行,这个进程就不会结束;

如果一个进程只有后台线程在运行,这个进程就会结束;

如果某个线程对象在启动(调用start()方法)之前调用setDaemon(true);方法,这个线程就变成了后台线程。

线程的状态转换:

image 

    * 多线程的方法有两种:

1、继承Thread类,并重写run()方法;

2、实现Runnable接口。

虽然有两种不同的方法,但是它们的多线程启动方法是相同的,都是同归Thread类来启动多线程的[p.start();]。

start使盖县程开始执行是指Java虚拟机调用该线程的run()方法;

start只是使线程就绪,什么时候开始执行由CPU决定。

线程只能启动一次;如果启动多次,程序在编译时不会出现错误,但是执行时会出现错误。

两种方法的不同在于:

方法1的缺点:Java为单继承,当一个想实现多线程的类继承了Thread类后就不可以再继承其他类,这样就不灵活,没有扩展性了;

方法2的优点:实现Runnable接口不仅可以再继承其他类,还可以实现资源共享。

总之实现Runnable接口比继承Thread类要更好一些,所以尽量要使用Runnable而不用Thread。

下面就这两种方法举例说明:

方法1,继承Thread类,重写run()方法。

class MyThread11 extends Thread{
    
private int time;
    
public MyThread11 (String name,int time){
        
super(name);
        
this.time=time;
    }

    
public void run(){
        
try {
            Thread.sleep(
this.time);
        }
 catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Thread.currentThread().getName()
+"-->运行,延迟 "+this.time+"毫秒。");
    }

}

public class MyDemo01 {
    
public static void main(String[] args) {
        MyThread11 mt1 
= new MyThread11("T--A",1000);
        MyThread11 mt2 
= new MyThread11("T--B",2000);
        MyThread11 mt3 
= new MyThread11("T--C",3000);
        mt1.start();
        mt2.start();
        mt3.start();
    }

}

程序运行结果:(每隔一秒打印一行,打印完后程序结束)
image 

方法2,实现Runnable接口。
class MyThread22 implements Runnable{
    
private int time;
    
private String name;
    
public MyThread22 (String name,int time){
        
this.name=name;
        
this.time=time;
    }

    
public void run() {
        
try {
            Thread.sleep(
this.time);
        }
 catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(
this.name+"-->运行,延迟 "+this.time+"毫秒。");
    }
    
}

public class MyDemo02 {
    
public static void main(String[] args) {
        MyThread22 mt1 
= new MyThread22("T--A",1000);
        MyThread22 mt2 
= new MyThread22("T--B",2000);
        MyThread22 mt3 
= new MyThread22("T--C",3000);
        
new Thread(mt1).start();
        
new Thread(mt2).start();
        
new Thread(mt3).start();
    }

}


程序运行结果:

(每隔一秒打印一行,打印完后程序结束)

image 
posted on 2010-11-08 16:33 Mineralwasser 阅读(366) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(1)

文章档案(21)

搜索

  •  

最新评论

阅读排行榜

评论排行榜