zoukankan      html  css  js  c++  java
  • 用Thread类创建线程-2

    支持原创,本系列文章均转自:http://www.blogjava.net/nokiaguy/category/38172.html 

    Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。Thread类的构造方法被重载了八次,构造方法如下:

    public Thread( );
    public Thread(Runnable target);
    public Thread(String name);
    public Thread(Runnable target, String name);
    public Thread(ThreadGroup group, Runnable target);
    public Thread(ThreadGroup group, String name);
    public Thread(ThreadGroup group, Runnable target, String name);
    public Thread(ThreadGroup group, Runnable target, String name, long stackSize);
    

    Runnable target

    实现了Runnable接口的类的实例。要注意的是Thread类也实现了Runnable接口,因此,从Thread类继承的类的实例也可以作为target传入这个构造方法。

    String name

    线程的名子。这个名子可以在建立Thread实例后通过Thread类的setName方法设置。如果不设置线程的名子,线程就使用默认的线程名:Thread-NN是线程建立的顺序,是一个不重复的正整数。

    ThreadGroup group

    当前建立的线程所属的线程组。如果不指定线程组,所有的线程都被加到一个默认的线程组中。关于线程组的细节将在后面的章节详细讨论。

    long stackSize

        线程栈的大小,这个值一般是CPU页面的整数倍。如x86的页面大小是4KB。在x86平台下,默认的线程栈大小是12KB 

    一个普通的Java类只要从Thread类继承,就可以成为一个线程类。并可通过Thread类的start方法来执行线程代码。虽然Thread类的子类可以直接实例化,但在子类中必须要覆盖Thread类的run方法才能真正运行线程的代码。下面的代码给出了一个使用Thread类建立线程的例子:

     1 package com.fly.example;
     2 public class MyThreadOne extends Thread {
     3     public void run(){
     4         System.out.println(this.getName());
     5     }
     6     
     7     public static void main(String[] args){
     8          System.out.println(Thread.currentThread().getName());
     9          MyThreadOne  thread1 = new MyThreadOne();
    10          MyThreadOne  thread2 = new MyThreadOne();
    11          
    12          thread1.start();
    13          thread2.start();
    14     }
    15      
    16 }

    上面的代码建立了两个线程:thread1和thread2。上述代码中的3至5行是Thread1类的run方法。当在12和13行调用start方法时,系统会自动调用run方法。在4行使用this.getName()输出了当前线程的名字,由于在建立线程时并未指定线程名,因此,所输出的线程名是系统的默认值,也就是Thread-n的形式。在8行输出了主线程的线程名。
        上面代码的运行结果如下:

     main

     Thread-0
     Thread-1

    从上面的输出结果可以看出,第一行输出的main是主线程的名子。后面的Thread-1Thread-2分别是thread1thread2的输出结果。 

     注意:任何一个Java程序都必须有一个主线程。一般这个主线程的名子为main.只有在程序中建立另外的线程,才能算是真正的多线程程序。也就是说,多线程程序必须拥有一个以上的线程。 

    Thread类有一个重载构造方法可以设置线程名。除了使用构造方法在建立线程时设置线程名,还可以使用Thread类的setName方法修改线程名。要想通过Thread类的构造方法来设置线程名,必须在Thread的子类中使用Thread类的public Thread(String name)构造方法,因此,必须在Thread的子类中也添加一个用于传入线程名的构造方法。下面的代码给出了一个设置线程名的例子:

     1     package mythread;
     2      
     3      public class Thread2 extends Thread
     4      {
     5          private String who;
     6      
     7          public void run()
     8          {
     9              System.out.println(who + ":" + this.getName());
    10          }
    11          public Thread2(String who)
    12          {
    13              super();
    14             this.who = who;
    15          }
    16          public Thread2(String who, String name)
    17          {
    18              super(name);
    19              this.who = who;
    20          }
    21          public static void main(String[] args)
    22          {
    23             Thread2 thread1 = new Thread2 ("thread1", "MyThread1");
    24              Thread2 thread2 = new Thread2 ("thread2");
    25 Thread2 thread3 = new Thread2 ("thread3"); 26 thread2.setName("MyThread2"); 27 thread1.start(); 28 thread2.start(); 29 thread3.start(); 30 } 31

    在main方法中建立了三个线程:thread1、thread2和thread3.其中thread1通过构造方法来设置线程名,thread2通过setName方法来修改线程名,thread3未设置线程

    运行结果如下:

    thread1:MyThread1
    thread2:MyThread2
    thread3:Thread-1

    从上面的输出结果可以看出,thread1和thread2的线程名都已经修改了,而thread3的线程名仍然为默认值:Thread-1.  thread3 之所以为Thread-1是因为:

    当创建完三个线程时, thread1, thread2, thread3的线程名分别是:MyThread1,   Thread-0,  Thread-1.    而thread2.setName("MyThread2") 又将Thread-0名称覆盖了,所以,thread3的名称就为Thread-1. (可以在26行前、后加上以下语句来测试:System.out.println("Test:"+thread1.getName() + "=="+thread2.getName() +"=="+thread3.getName() ); )

        注意:在调用start方法前后都可以使用setName设置线程名,但在调用start方法后使用setName修改线程名,会产生不确定性,也就是说可能在run方法执行完后才会执行setName.如果在run方法中要使用线程名,就会出现虽然调用了setName方法,但线程名却未修改的现象。

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

     

     

  • 相关阅读:
    2014--My Plan
    C++操作xls
    fail2ban[防止linux服务器被暴力破解]
    8.1向上转型
    寒假的一个月--实现自己的五部狂奏曲
    浅谈《think in java》:二 一切都是对象
    浅谈《think in java》:一 对象导论总结
    增加Myecllipse内存
    java 容器 集合 用法
    SVN用户切换
  • 原文地址:https://www.cnblogs.com/dragonflyyi/p/3527109.html
Copyright © 2011-2022 走看看