码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-16 08:15:35      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:java并发   多线程   

《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()并且死亡之后才能把它清理掉。

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:java并发   多线程   

原文地址:http://blog.csdn.net/lb_383691051/article/details/47698813

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!