`
gzcj
  • 浏览: 287050 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jdk5.0 多线程学习笔记(四)

阅读更多

学了这么久,终于进入jdk5.0的线程编程了。

先来看一段代码:

public class ThreadPoolTest {
	public static void main(String[] args) {
        int numWorkers = 10;//工作线程数
        int threadPoolSize = 2;//线程池大小
        ExecutorService tpes =
            Executors.newFixedThreadPool(threadPoolSize);//初始化线程池

        WorkerThread[] workers = new WorkerThread[numWorkers];
        for (int i = 0; i < numWorkers; i++) {
            workers[i] = new WorkerThread(i);//初始一个任务
            tpes.execute(workers[i]);//执行任务
        }
        tpes.shutdown();//所有线程执行完毕后才关闭。
//         tpes.shutdownNow();//立即关闭
    }

}

 

看看工作线程:

public class WorkerThread implements Runnable {

	private int workerNumber;

    WorkerThread(int number) {
        workerNumber = number;
    }

    public void run() {
        for (int i=0;i<=100;i+=20) {
        //Perform some work...
            System.out.format("Worker number: %d, percent complete: %d%n",
                workerNumber, i);
            try {
                Thread.sleep((int)(Math.random() * 1000));
            } catch (InterruptedException e) { }
        }
    }


}

 

从执行的结果可以看出:有两个线程在执行操作,因为我们的线程池中就只有两个线程。

这里要注意一下:

tpes.execute(workers[i]);

这里不是启动一个新线程,而是在仅仅是调用了run方法,并没有新建线程。这一点可以参看如下代码(节选自jdk5):

**  
         * Run a single task between before/after methods.  
         */  
        private void runTask(Runnable task) {   
            final ReentrantLock runLock = this.runLock;   
            runLock.lock();   
            try {   
                // Abort now if immediate cancel.  Otherwise, we have   
                // committed to run this task.   
                if (runState == STOP)   
                    return;   
  
                Thread.interrupted(); // clear interrupt status on entry   
                boolean ran = false;   
                beforeExecute(thread, task);   
                try {   
                    task.run();  //调用的是run()方法 而不是start()   
                    ran = true;   
                    afterExecute(task, null);   
                    ++completedTasks;   
                } catch(RuntimeException ex) {   
                    if (!ran)   
                        afterExecute(task, ex);   
                    // Else the exception occurred within   
                    // afterExecute itself in which case we don't   
                    // want to call it again.   
                    throw ex;   
                }   
            } finally {   
                runLock.unlock();   
            }   
        }  

 

请注意task.run(); 这句, 这儿并没有启动线程 而是简单的调用了一个普通对象的一个方法

从多线程设计的角度来讲,jdk5中的线程池应该是基于worker模式的。下一节将对worker模式进行介绍,以加深对jdk5中多线程编程的理解。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics