java 多线程第一弹-多线程入门

   自己一直是个比较慵懒的人, 学习到什么东西从来不知道总结,记录, 这就形成了一个非常不好的现象,就是当时学习过 使用过的东西或者技术,过些日子,如果找不到之前的代码, 那就需要从新在学习, 总是忘记, 忘记, 不断的忘记, 归根结底, 还是自己太懒了!

   应该强制性的  让自己多写写, 必定会受益匪浅的!

 

   好了 进入今天的正题,多线程对于一个J2ee的开发者来说 一般是很少接触的, 但是应用却无处不在!

   今天来给大家介绍基本的java多线程知识!

   提到多线程 我们必须要了解一个类  Thread  和 一个借口  Runnable

  并且 Thread  是实现了的 Runnable 接口 的类型

  Thead 类的API  有很多构造方法,

   

Thread() 
          分配新的 Thread 对象。 
Thread(Runnable target) 
          分配新的 Thread 对象。 
Thread(Runnable target, String name) 
          分配新的 Thread 对象。 
Thread(String name) 
          分配新的 Thread 对象。 
Thread(ThreadGroup group, Runnable target) 
          分配新的 Thread 对象。 
Thread(ThreadGroup group, Runnable target, String name) 
          分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,并作为 group 所引用的线程组的一员。 
Thread(ThreadGroup group, Runnable target, String name, long stackSize) 
          分配新的 Thread 对象,以便将 target 作为其运行对象,将指定的 name 作为其名称,作为 group 所引用的线程组的一员,并具有指定的堆栈大小。 
Thread(ThreadGroup group, String name) 
          分配新的 Thread 对象。 
 

  我们看到其中有 

Thread(Runnable target)  这样的构造方法。

一、因此线程的创建方式常用的有两种
1、 Thread t = new Thread()

2、 Thread t1 = new Thread(new Runnable(){...});

平常使用呢 我们一般建议采用第二种方法, 为什么呢? 因为 第二种方法实现接口比较灵活,符合java 的多态特性!


二、线程的join 和 yield 方法

       join 方法的意思 是 调用线程 等待 该线程结束之后再执行 注意是调用线程 不是主线程

  一个简单的小例子:

 1 public class MethodTest {
 2 
 3     public static void main(String[] args) {
 4         
 5         Thread t1 = new Thread(new T("t1"));
 6         t1.start();
 7         
 8         //Thread t2 = new Thread(new T("t2"));
 9        // t2.start();
10         
11         try {
12             t1.join(); // 主线程(调用(发起)线程)  等待该线程执行完毕
13             //t1.yield(); //让出cpu一段时间
14         } catch (Exception e) {
15             e.printStackTrace();
16         }
17         for (int i = 0; i < 10; i++) {
18             
19             System.out.println("main i=" + i);
20             //Thread.sleep(1000);
21         }
22         
23     }
24 }
25 
26 
27 
28 class T implements Runnable {
29 
30     private String flag;
31     public T(String flag) {
32         this.flag = flag;
33     }
34     
35     @Override
36     public void run() {
37         Thread t3 =  new Thread(new T1("t3"));
38         t3.start();
39         try {
40             t3.join();
41         } catch (InterruptedException e1) {
42             e1.printStackTrace();
43         }
44         for (int i = 0; i < 10; i++) {
45             System.out.println(flag + ":i=" + i);
46             try {
47                
48             } catch (Exception e) {
49                 e.printStackTrace();
50             }
51         }
52     }
53     
54 }
55 
56 class T1 implements Runnable {
57 
58     private String flag;
59     public T1(String flag) {
60         this.flag = flag;
61     }
62     
63     @Override
64     public void run() {
65 
66         for (int i = 0; i < 10; i++) {
67             System.out.println(flag + ":i=" + i);
68             try {
69             } catch (Exception e) {
70                 e.printStackTrace();
71             }
72         }
73     }
74     
75 }

t3:i=0
t3:i=1
t3:i=2
t3:i=3
t3:i=4
t3:i=5
t3:i=6
t3:i=7
t3:i=8
t3:i=9
t1:i=0
t1:i=1
t1:i=2
t1:i=3
t1:i=4
t1:i=5
t1:i=6
t1:i=7
t1:i=8
t1:i=9
main i=0
main i=1
main i=2
main i=3
main i=4
main i=5
main i=6
main i=7
main i=8
main i=9

 

上边是输出结果, 显而易见  是按照t3, t1 , main 线程按次序执行的, 因为t1调用join方法 就是告诉main 你要等我执行完了 你再执行, 而在执行t1的时候

  里边开启了一个T3线程,而且t3 告诉t1 你要等我 执行完了 你再执行, 所以是t3 , t1 , main这样的顺序来执行的!

 

关于yield()方法,就是告诉调用线程  我让出一点cpu来, 仅仅是让出一小会!

 

写的乱起八糟 啊, 继续努力!

 

 

 

  

posted @ 2014-03-01 23:38  gavinage  阅读(220)  评论(0编辑  收藏  举报