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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李月 中级黑马   /  2012-4-29 22:28  /  1788 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class PrintThread implements Runnable{
        private String name;
        public PrintThread(){
               
        }
        public PrintThread(String name){
                super();
                this.name=name;
        }
        public void run(){
                print();
        }
        private void print() {
                // TODO Auto-generated method stub
                System.out.println(name+"开始打印");
        }
}




public class TestThread {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO Auto-generated method stub
                PrintThread p1=new PrintThread("打印机1");
                p1.start();
                                Thread t=new PrintThread("打印机2");
                                 t.start();
        }

}

为什么我创建的线程开起不了呢?总是报错,求解。

5 个回复

倒序浏览
/*线程的第二种实现方式:实现Runnable接口,在调用的时候首先要创建对象
* 然后把对象放到线程中去,最后启动线程,你的下面写错了,
* 修改后的代码:希望可以帮到你
* */
class PrintThread implements Runnable{
        private String name;
        public PrintThread(){
               
        }
        public PrintThread(String name){
                super();
                this.name=name;
        }
        public void run(){

                print();
        }
        private void print() {
               
                System.out.println(name+"开始打印");
        }
}




public class Test19 {

      
        public static void main(String[] args) {

                // TODO Auto-generated method stub
                PrintThread p1=new PrintThread("打印机1");//创建对象
                Thread  t1= new Thread(p1);//创建线程传入对象

                t1.start();//启动线程
               
        }

}

运行结果:

打印机1  开始打印
回复 使用道具 举报
你的类既然实现了Runnable接口,
就要把Runnable子类对象作为参数传入Thread对象中才行。如下

PrintThread p1=new PrintThread("打印机1");
Thread1 t1 = new Thread(p1);
t1.start();
Thread t2 =new Thread(new PrintThread("打印机2"));
t2.start();
要是想使用你自己的写法,也可以让你自己的类继承Thread,可以达到相同的要求。
回复 使用道具 举报
本帖最后由 贾联国 于 2012-4-29 22:54 编辑

这么写肯定是不对的,创建多线程只能是Thread或其子类,仅仅实现Runnable无法创建多线程
class PrintThread implements Runnable
{
        private String name;
        public PrintThread(){
               
        }
        public PrintThread(String name){
            
                this.name=name;
        }
        public void run(){
                print();
        }
        private void print() {
                // TODO Auto-generated method stub
                System.out.println(this.name+"开始打印");
        }
}




public class TestThread {

        /**
         * @param args
         */
        public static void main(String[] args)
                {
                // TODO Auto-generated method stub
             PrintThread p1=new PrintThread("打印机1"); // 实现Runnable接口的多线程要这样创建。
  //因为Thead里有这样的构造方法 Thread(Runnable target)
         Thread t1 =new Thread (p1);
                         t1.start();
             PrintThread t=new PrintThread("打印机2");
                         Thread t2 =new Thread (t);
             t2.start();
                }

}
回复 使用道具 举报
这根本原因是你理解错了Thread的意思了,看你定义的类PrintThread 你把他当做是一个线程,而你只是实现了Runnable接口
我们知道:Runnable只是一个接口,仅仅实现这个接口是无法构建一个新线程的,必须由Thread类或其子类,而实现了Runnable接口的类仅仅
是作为Thread() 的一个参数(当然里面的run()方法是最重要的啦),
回复 使用道具 举报
本帖最后由 天道酬勤 于 2012-5-1 14:07 编辑

public class PrintThread implements Runnable{
        private String name;
        public PrintThread(){           
        }
        public PrintThread(String name){
                super();
                this.name=name;
        }
        public void run(){
                print();
        }
        private void print() {
                System.out.println(name+"开始打印");
        }
}
public class TestThread {
        public static void main(String[] args) {
            
          PrintThread p1=new PrintThread("打印机1");
          p1.start();//你这个不是线程对象,怎么可能具备线程的方法呢?
          Thread t=new PrintThread("打印机2");//错误,因为左边是Thread类,右边是Runable实现类
          t.start();
          //创建线程有两种方式:要么继承Thread ,要么实现Runable接口,将运行的任务封装成一个对象,
          //通过创建线程的对象,从构造函数中传递进去。
          //代码可以做如下修改
          //创建线程任务p1和p2
          PrintThread p1=new PrintThread("打印机1");
          PrintThread p2=new PrintThread("打印机2");
          //创建2个线程
          Thread t=new Thread(p1);
          Thread t1=new Thread(p2);
          //开启线程t和t2
          t.start();
          t1.start();
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马