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 }