java编写线程

编写线程有两种方式:一种是创建Thread子类并重写run方法

                            一种是创建类的时候实现Runnable接口,在myRunnable类中实现

下面为第一种创建Thread子类并重写run方法

package test.examples;
public class myThread extends Thread{
    public void run(){
        System.out.println("mythread running");
    }
    
    public static void main(String[] args)
    {
        myThread my = new myThread();
        my.start();
        
        //创建一个Thread的匿名子类
        Thread thread = new Thread(){
            public void run(){
                System.out.println("Thread running");
            }
        };
        thread.start();
        
        /*
         * 尽管启动线程是有顺序的,但是执行线程的顺序并非是有序的
         * 因为线程是并发执行而非顺序
         * JVM与操作系统一起决定了线程的执行顺序,与线程的启动顺序并非一致
         */
        System.out.println(Thread.currentThread().getName());
        for(int i=0;i<10;i++){
            new Thread(""+i){
                public void run(){
                    System.out.println("Thread" + getName() + "running");
                }
            }.start();
        }
    }
}

创建类的时候实现Runnable接口

package test.examples;

public class myRunnable implements Runnable{

    @Override
    public void run() {
        System.out.println("myRunnable running");
    }
    
    public static void main(String[] args){
        //需要在Thread类的构造函数中传入myRunnable的实例对象
        Thread thread = new Thread(new myRunnable());
        thread.start();
        
        //创建一个实现了Runnable接口的匿名类
        Runnable my = new Runnable(){
            public void run(){
                System.out.println("Runnable running");
            }
        };
        Thread thread1 = new Thread(my);
        thread1.start();
    }
}

两种方法并没有好坏之分,线程池的有效管理实现了Runnable接口的线程,如果线程池满了新的线程就会排队等候执行,
直到线程池空闲出来为止。如果线程是通过实现Thread子类实现的,会复杂一些

常见错误:调用run()方法而非start()方法
   myThread my = new myThread();
   my.run();
起初不会觉得什么,事实上run()方法并非是由刚创建的新线程所执行的,而是被新创建新线程的当前线程所执行,也就是被执行上面两行代码的线程所执行想要让创建的新线程执行run()方法,必须调用新线程的start()方法

 创建新线程的时候可以给线程起个名字,有助于区分不同的线程,如下:
  myRunnable runnable = new myRunnable();
  Thread thread = new Thread(runnable,"new Thread");
   thread.start();
   System.out.println(thread.getName());

Thread.currentThread();可以得到当前线程的引用
String threadName = Thread.currentThread().getName();得到当前线程的名字

posted on 2016-07-28 16:25  羽溪夜  阅读(100)  评论(0编辑  收藏  举报

导航