黑马程序员技术交流社区

标题: 问一个线程里的问题 [打印本页]

作者: 黑马高明辉    时间: 2012-7-16 20:53
标题: 问一个线程里的问题
public static void main(String[] args) {
                        //创建既定大小的缓冲池。
//                        ExecutorService threadPool = Executors.newFixedThreadPool(3);
                        //创建一个缓冲线程池,按照线程的数量来决定缓冲池的大小。
                        ExecutorService threadPool = Executors.newCachedThreadPool();
                        //创建一个单线程的缓冲池,始终保持该线程池中有一个线程,如果当前线程结束,那么该方法会再创建一个线程来接替前一个线程。
//                        ExecutorService threadPool = Executors.newSingleThreadExecutor();
                        for(int i=1;i<=12;i++){
                                final int task = i;
                                threadPool.execute(new Runnable(){
                                        static{
                                                System.out.println("task is committed!");
                                        }
                                        @Override
                                        public void run() {
                                                for(int j=1;j<=5;j++){
                                                        try {
                                                                Thread.sleep(20);
                                                        } catch (InterruptedException e) {
                                                                // TODO Auto-generated catch block
                                                                e.printStackTrace();
                                                        }
                                                        System.out.println(Thread.currentThread().getName() + " is looping of " + j + " for  task of " + task);
                                                }
                                        }
                                });
                        }
                        try {
                                Thread.sleep(1000);
                        } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                        System.out.println("all of 10 tasks have committed! ");
红色代码有错误,说是内部类中不能定义静态代码块,我想问的是:我在new一个Runnable对象的时候,是不是就创建了一个任务,怎样在这个任务初始化的时候输出任务已经创建这样的标识?通过静态代码快看来是不行了,还有别的方法么?
作者: 封明川    时间: 2012-7-16 21:06
把static去掉,
用构造代码块
作者: 山水游客    时间: 2012-7-16 21:50
可以定义一个Task类实现Runnable接口,在造方法中传入task参数,并打印System.out.println("task is committed!");
如此只要Runnable被初始化,标识就会被打印出来!
作者: 陆鹏    时间: 2012-7-17 08:09
本帖最后由 陆鹏 于 2012-7-17 08:10 编辑

楼主的说法有两个问题:
1.普通内部类中是不能定义静态成员,匿名内部类属于没有名字的普通内部类,当然也不能定义静态成员了,静态成员也就包括了静态代码块。
当然,静态内部类中可以定义静态或者非静态的成员
2.你不能new 一个Runnable对象,因为Runnable是接口,只能new一个Runnable的子类对象。

解决楼主的问题:怎样在这个任务初始化的时候输出任务已经创建这样的标识?
如果是匿名内部类的话,那就用构造代码块





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2