java多线程细节

来源:互联网 发布:java分布式开发书 编辑:程序博客网 时间:2024/06/11 20:09
1.线程名的占用问题
public class Demo1 extends Thread{ private String who;       public void run()      {          System.out.println(who + ":" + this.getName());      }      public Demo1(String who)      {          super();          this.who = who;      }      public Demo1(String who, String name)      {          super(name);          this.who = who;      }      public static void main(String[] args)      {      Demo1 thread1 = new Demo1 ("thread1", "MyThread1");      Demo1 thread2 = new Demo1 ("thread2","MyThread2");      Demo1 thread3 = new Demo1 ("thread3");          thread1.start();          thread2.start();          thread3.start();      }}

结果:
thread1:MyThread1thread3:Thread-0thread2:MyThread2

注:输出结果顺序不固定

public class Demo1 extends Thread{ private String who;       public void run()      {          System.out.println(who + ":" + this.getName());      }      public Demo1(String who)      {          super();          this.who = who;      }      public Demo1(String who, String name)      {          super(name);          this.who = who;      }      public static void main(String[] args)      {      Demo1 thread1 = new Demo1 ("thread1", "MyThread1");      Demo1 thread2 = new Demo1 ("thread2");      Demo1 thread3 = new Demo1 ("thread3");          thread2.setName("MyThread2");          thread1.start();          thread2.start();          thread3.start();      }}

thread2:MyThread2thread3:Thread-1thread1:MyThread1


通过比较:创建线程时,如果不设置线程名,系统会自动分配线程名,并占位,通过thread3:Thread-1就可断定thread2占据着Thread-0的位置

2.Thread类的start方法不能多次调用,如不能调用两次thread1.start()方法。否则会抛出一个IllegalThreadStateException异常

3.如果通过继承Runnable的方式创建线程,很多方法都不能用(如isAlive等)
Runnable接口源码如下:
/** * The <code>Runnable</code> interface should be implemented by any * class whose instances are intended to be executed by a thread. The * class must define a method of no arguments called <code>run</code>. * <p> * This interface is designed to provide a common protocol for objects that * wish to execute code while they are active. For example, * <code>Runnable</code> is implemented by class <code>Thread</code>. * Being active simply means that a thread has been started and has not * yet been stopped. * <p> * In addition, <code>Runnable</code> provides the means for a class to be * active while not subclassing <code>Thread</code>. A class that implements * <code>Runnable</code> can run without subclassing <code>Thread</code> * by instantiating a <code>Thread</code> instance and passing itself in * as the target.  In most cases, the <code>Runnable</code> interface should * be used if you are only planning to override the <code>run()</code> * method and no other <code>Thread</code> methods. * This is important because classes should not be subclassed * unless the programmer intends on modifying or enhancing the fundamental * behavior of the class. * * @author  Arthur van Hoff * @see     java.lang.Thread * @see     java.util.concurrent.Callable * @since   JDK1.0 */publicinterface Runnable {    /**     * When an object implementing interface <code>Runnable</code> is used     * to create a thread, starting the thread causes the object's     * <code>run</code> method to be called in that separately executing     * thread.     * <p>     * The general contract of the method <code>run</code> is that it may     * take any action whatsoever.     *     * @see     java.lang.Thread#run()     */    public abstract void run();}

问题:如果我需要extends其他类,又要用到isAlive方法怎么办?
0 0
原创粉丝点击