学习笔记(九)并发(一)

《Java编程思想》整理的一些学习笔记,有不对的地方,欢迎指出。
1.对象技术提供了一种把程序划分成若干独立部分的方式。通常,还需要把程序转换成彼此分离的,能独立运行的子任务。每个独立子任务被称为一个“线程”。而进程,是一个自包含的运行程序,它有自己的地址空间。操作系统通过周期性的将CPU分配到不同的任务,使其能够同时运行不止一个进程,而每个进程都像是连续运行,一气呵成的。线程是进程内部的一个控制序列流。所以一个进程可以具有多个并发执行的线程。
2.使用并发的最引人注目的理由之一就是,产生一个可作出响应的用户界面。我们希望程序需要一边连续进行计算,同时还要把控制权交给用户界面,这样程序才能响应用户的操作。例如:如果你有一个“退出”按钮,你一定不希望在程序的每段代码里都检测按钮的状态,但你还是希望对这个按钮能够作出响应,就好像你定期对其进行检测一样。即好像让CPU同时出现在两个地方,传统方法解决不了,这时候就要用到并发。
3.并发还可以用来优化程序的吞吐量。比如在等待数据到达输入/输出端口的同时,可以进行其他重要的工作。若是不使用线程,唯一可行的就是不断的查询输入/输出端口,这种方法不仅笨拙,而且很困难。另外注意,具有多个线程的程序,必须也能够在只有单CPU的机器上运行。
4.写一个线程最简单的做法就是从java.lang.Thread继承,Thread最重要的方法是run(),我们要覆盖这个方法,以达到我们的目的。这样run()里的代码就能够与程序里的其他线程“同时”运行。
创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动。采用这种风格的同一个例子如下所示:


 class PrimeRun implements Runnable {
     long minPrime;
     PrimeRun(long minPrime) {
         this.minPrime = minPrime;
     }

     public void run() {
         // compute primes larger than minPrime
          . . .
     }
 }

然后,下列代码会创建并启动一个线程:

 PrimeRun p = new PrimeRun(143);
 new Thread(p).start();

每个线程都有一个标识名,多个线程可以同名。如果线程创建时没有指定标识名,就会为其生成一个新名称。
5.Tread对象的run()方法事实上总会有某种形式的循环,使得线程一直运行下去知道不再需要,所以要设定跳出循环的条件。通常,run()被写成无限循环的形式,这就意味着,除非有某个条件使得run()终止,否则它将永远运行下去。
6.Tread类的start()方法将为线程执行特殊的初始化操作,然后自动调用run()方法。所以整个步骤是:首先调用构造器来构造对象,在构造器中调用了start()方法来配置线程,然后有线程执行机制调用run()。如果不调用start(),线程永远不会启动(也可以不必在构造器中调用)。
7.因为线程调用机制的行为是不确定的,所以每次运行程序都会产生不同的输出结果,JDK版本低的可能会先执行完线程1才会执行下一线程,JDK1.4以后,调度器采用更合适的时间切片行为,可以使得线程可以穿插执行。
8.当在main()函数中创建若干个Thread对象的时候,并没有获得它们中任何一个的引用,给个例子:

public class Demo extends Thread{

    private int countDown = 5;
    private static int threadCount = 0;

    public Demo(){
        super(""+ ++threadCount);              // 调用Tread构造器,给线程对象指定一个名字
        start();
    }

    public String toString(){
        return "#"+getName()+":"+ countDown;  //  使用getName()方法获取线程的名字
    }

    public void run(){
        while(true){
            System.out.println(this);
            if(--countDown == 0)
                return;
        }
    }

    public static void main(String[] args){

        for(int i = 0; i < 5; i++){
            new Demo();
        }
    }
}

就像上述的例子中,只是创建了对象没有对应的引用。对于普通的对象而言,这会使它成为垃圾回收器要回收的目标,但对于Thread对象就不会了。每个Thread对象都需要“注册”自己,所以实际上在某个地方存在着对它的引用,垃圾回收器只有在线程离开了run()并且死亡之后才能把它清理掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值