1 /* 2 *Thread常用方法 3 *1.start():启动当前的线程,调用当前线程的run() 4 *2.run():通常需要重写Thread类中的此方法,将创建要执行的操作声明在此方法中 5 *3.currentThread():静态方法,返回代码执行的线程 6 *4.getName():获取当前线程的名字 7 *5.setName():设置当前线程的名字 8 *6.yield():释放当前CPU的执行 9 *7.join():在线程a中调用线程b的join()方法,此时线程a进入阻塞状态 10 *8.stop():已过时的方法,当执行此方法是,强制结束当前进程 11 *9.sleep(long millitime):让当前进程睡眠指定的毫秒数,在指定时间内,线程是阻塞状态 12 *10.isAlive():判断进程是否存活 13 */ 14 class HelloThread extends Thread 15 { 16 public void run() 17 { 18 for(int i=1;i<20;i++) 19 { 20 if((i&1)==0) 21 {/* 22 sleep(),是静态的可以直接通过类调用,会抛异常 23 HelloThread是继承在Thread里的,在Thread里run()没有抛异常(子类重写方法抛出的异常<=父类被重写异常抛出的方法), 24 所以此处不可以throws,只能用try-catch 25 */ 26 try { 27 sleep(1000);//阻塞1000ms,即1s 28 } catch (InterruptedException e) { 29 // TODO Auto-generated catch block 30 e.printStackTrace(); 31 } 32 //在1s阻塞后,等CPU分配资源再运行主程序 33 System.out.println(Thread.currentThread().getName()+":"+i); 34 } 35 if(i%10==0) 36 { 37 this.yield(); 38 } 39 } 40 } 41 /*在源码中可以看到 Thread有对于名字命名的构造器 42 * public Thread(String name) { 43 * init(null, null, name, 0); 44 * } 45 * 所以子类继承父类的构造器就行 46 */ 47 /* 48 public HelloThread(String name) 49 { 50 super(name); 51 } 52 */ 53 } 54 public class test{ 55 public static void main(String[] args) { 56 //给线程命名方法1 调用setName() 57 HelloThread h1=new HelloThread(); 58 HelloThread h2=new HelloThread(); 59 h1.setName("*1*"); 60 h2.setName("*2*"); 61 h1.start(); 62 h2.start(); 63 //给线程命名方法2 建立类对象,调用构造器 64 /* 65 *HelloThread h2=new HelloTHread("*2*"); 66 */ 67 //给主线程命名 68 Thread.currentThread().setName("主线程"); 69 for(int i=0;i<20;i++) 70 { 71 if((i&1)==1) 72 { 73 System.out.println(Thread.currentThread().getName()+":"+i); 74 } 75 if(i==10) 76 { 77 try {//主线程中调用h1的join()方法,此时主线程进入阻塞状态 78 h1.join();//join是Thread中的方法,不是该类中的方法,只能通过继承Thread类的子类对象调用 79 } catch (InterruptedException e) { 80 // TODO Auto-generated catch block 81 e.printStackTrace(); 82 } 83 } 84 } 85 } 86 }
通过上述学习的方法,我们来完成一个具体的例子。
创建三个窗口共卖100张票。(暂时忽略线程不安全即出现重票现象)
1.通过类继承Thread实现
1 //创建三个窗口共卖100张票 2 3 class Window extends Thread 4 { 5 private static int ticket=100; 6 public void run() 7 { 8 while(true) 9 { 10 if(ticket>0) 11 { 12 System.out.println(getName()+":卖票,票号为:"+ticket); 13 ticket--; 14 } 15 else 16 break; 17 } 18 } 19 } 20 public class test 21 { 22 public static void main(String[] args) 23 { 24 Window t1=new Window(); 25 Window t2=new Window(); 26 Window t3=new Window(); 27 t1.setName("*1*"); 28 t2.setName("*2*"); 29 t3.setName("*3*"); 30 t1.start(); 31 t2.start(); 32 t3.start(); 33 } 34 }
2.通过类调用接口实现
1 //创建三个窗口共卖100张票 2 class Window implements Runnable 3 { 4 private int ticket=100; 5 public void run() 6 { 7 while(true) 8 { 9 if(ticket>0) 10 { 11 System.out.println(Thread.currentThread().getName()+"卖票,票号为:"+ticket); 12 ticket--; 13 } 14 else 15 break; 16 } 17 } 18 } 19 public class test{ 20 public static void main(String[] args) { 21 Window w=new Window();//因为只造了一个Window类对象,3个线程公用一个进程,所以不用把ticket声明为静态的 22 Thread t1=new Thread(w); 23 Thread t2=new Thread(w); 24 Thread t3=new Thread(w); 25 t1.setName("1"); 26 t1.setName("2"); 27 t1.setName("3"); 28 t1.start(); 29 t2.start(); 30 t3.start(); 31 } 32 }