A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马高明辉 中级黑马   /  2012-7-16 20:53  /  1991 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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对象的时候,是不是就创建了一个任务,怎样在这个任务初始化的时候输出任务已经创建这样的标识?通过静态代码快看来是不行了,还有别的方法么?

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

3 个回复

倒序浏览
把static去掉,
用构造代码块
回复 使用道具 举报
可以定义一个Task类实现Runnable接口,在造方法中传入task参数,并打印System.out.println("task is committed!");
如此只要Runnable被初始化,标识就会被打印出来!
回复 使用道具 举报
本帖最后由 陆鹏 于 2012-7-17 08:10 编辑

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

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

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马