多线程的创建

来源:互联网 发布:丝路英雄葱岭冒险数据 编辑:程序博客网 时间:2024/05/22 13:41
一、用继承java.lang.Thread的方法创建多线程
     创建多线程可以让一个类通过继承Thread类并且重写其run()方法来创建,在run()方法中应该写上该线程要实现的具体功能,创建好多线程后,可以在主函数中创建其对象,通过该对象去调用start()方法(不能调用run())来启动此线程,但是一个线程只能执行一次start()方法,具体的创建过程看下面的代码:
//通过继承创建多线程
public class TestThread {
public static void main(String[] args) {//其实main是一个隐藏的线程
        //2、创建子类对象
       SonThread p1 = new SonThread();
        //开启线程
        p1.start();
        //main线程
        for(int i = 0;i <10;i ++)
       {
              System. out.println("main:" +i );
       }
}
}

//1、创建子类,让子类继承 Therad
class SonThread extends Thread{
        public void run()
       {
               for(int i = 0;i <10;i ++)
              {
                     System. out.println("Therad:" +i );
              }
       }
}
     上面就是通过继承创建多线程的过程了,子类SonThread中重写了run()方法,令其去打印数字0~9main方法中同样也是打印0~9,而在main方法中又开启了一个线程p1,开启之后main线程与p1线程一起执行,在执行过程中它们要反复的去抢占cpu的执行权谁先抢到谁就先执行,直到执行完。
二、Thread的常用方法
     1、start()  启动线程并执行相应的run()方法
     2、run()  子线程重写该方法将需要执行的代码放入run()方法中
     3、currentThread()  调用当前的线程
     4、getName()  获取当前线程的名字
     5、setName() 设置当前线程的名字
     6、yield()  释放调用此方法的线程的CPU执行权
     7、join()  在当前线程A中调用另一个线程B的join()方法,当执行到此方法时,当前线程A立即停止执行,调用join()方法的线程B开始执行,直到执行完毕,当前线程A再执行join()方法之后的代码
     8、isAlive()  判断当前的线程是否还存活
     9、sleep(long l) 显示的零当前线程睡眠 l 毫秒
     10、getPriority()  返回线程的优先值(最大为10  默认为5  最小为1)
     11、setPriority()  设置线程的优先级
     12、wait()  notify()  notifyAll()  用于线程通信方面
三、通过实现Runnable接口创建多线程·
     创建多线程的另一种方法是可以通过让一个类实现Runnable接口来创建多线程,而Runnable的实现类必须重写run()方法,将子线程需要执行的代码放入到run()方法中,当要具体去启动子线程时,由于启动一个线程必须要用start()方法,而我们直到Runnable接口中是没有start()这个方法的,这时我们就要将其实现类的对象作为参数传递到一个Thread类对象的构造器中,然后通过调用这个Thread类对象的start()方法去启动该子线程,若要再启动一个子线程,无需再创建一个实现类的对象,只需再创建一个Thread类的对象然后将先前创建的实现类对象传入到其构造器中然后再次调用start()方法即可。
     因此,通过实现的方式创建多线程避免了JAVA中单继承的局限性,同时在实现多个线程操作同一个资源时比继承Thread的方式更适合,下面时其具体的实现方法:
//利用实现Runnable接口的方式创建多线程
class test implements Runnable{
        public void run(){
               while (true )
              {
                      if (i>0)
                     {
                            System.out.println(Thread.currentThread().getName()+ ":" i--);
                     }
                      else {
                            break ;
                     }
              }

       }
}
public class TestRunnable {
        public static void main (String[] args ) {
        //创建Runnable接口实现类的对象
       test p = new test();
        //将该对象作为参数传递到Thread对象的构造器中
       Thread T = new Thread(p );
        //调用start()方法
        T.start();
       Thread T1 = new Thread(p );
        T1.start();
       }
}