当前位置: 移动技术网 > IT编程>开发语言>Java > Java分享笔记:创建多线程 & 线程同步机制

Java分享笔记:创建多线程 & 线程同步机制

2018年08月18日  | 移动技术网IT编程  | 我要评论

陈滔淘,远古血冠鹤,春节送礼品

[1] 创建多线程的两种方式

  1.1 通过继承thread类创建多线程

    1.定义thread类的子类,重写run()方法,在run()方法体中编写子线程要执行的功能。

    2.创建子线程的实例对象,相当于新建了一条子线程。

    3.调用子线程的start()方法,子线程启动并执行run()方法中的功能。

  1.2 通过实现runnable接口创建多线程

    1.定义一个类,实现runnable接口,重写run()方法,在run()方法体中编写子线程要执行的功能。

    2.创建实现类的对象。

    3.调用thread类的有参构造函数,将上述实现类对象作为形参传入,创建thread类的对象。该对象相当于一条新线程。

    4.调用thread对象的start()方法,子线程启动并执行run()方法中的功能。

 

[2] 线程同步机制

  当多条线程操作共享数据时,会出现线程安全问题。为了解决这一问题,需要保证不同线程在访问同一数据时保持一定的顺序,即“线程的同步机制”。实现该机制有两种方法:同步代码块,同步方法。前者可以指定任意对象作为监视器,后者只能默认使用当前对象作为监视器。故使用同步方法保证线程同步有一定的局限性。

 

[3] 代码实例

  3.1 通过继承thread类创建多线程,并使用同步代码块的方式保证线程的同步。

 1 //通过继承thread类的方式创建多线程
 2 //多条线程操作同一个共享资源,存在线程安全问题
 3 //通过同步代码块的方式使线程同步
 4 package pack01;
 5 
 6 //定义子线程
 7 class subthread extends thread {
 8 
 9     private static int i = 1;
10     static object lock = new object();    //创建静态对象作为监视器
11 
12     // 子线程要实现的功能:将静态变量i累加到100,并打印每次的累加结果
13     // 由于多条线程会同时操作静态变量i,故需要保证线程的同步
14     public void run() {
15 
16         while (true) {
17             
18             synchronized (lock) {
19                 if (i <= 100) {
20                     system.out.println(thread.currentthread().getname() + "----" + i);
21                     ++i;
22                     
23                 } else {
24                     break;
25                 }
26             }
27         }
28 
29     }
30 }
31 
32 public class multhread {
33     public static void main(string[] args) {
34 
35         subthread st1 = new subthread();
36         subthread st2 = new subthread();
37 
38         // 设置线程名称
39         st1.setname("one####");
40         st2.setname("two....");
41 
42         // 启动线程
43         st1.start();
44         st2.start();
45     }
46 }

 

  3.2 通过实现runnable接口创建多线程,使用同步方法保证线程同步。

 1 //通过实现runnable接口的方式创建多线程
 2 //多条线程操作同一个共享资源,存在线程安全问题
 3 //通过使用同步方法保证线程的同步
 4 package pack01;
 5 
 6 class sub implements runnable{
 7 
 8     private static int i=1; //被多条线程共同操作的静态变量
 9     
10     public void run() {
11         while(true) {
12             printi();
13         }
14     }
15     
16     public synchronized void printi() { //将要需要同步的代码封装进一个同步方法中
17         
18         if(i<=100) {
19             system.out.println( thread.currentthread().getname() + "----" + i );
20             ++i;
21         } else {
22             system.exit(0);
23         }
24     }
25 }
26 
27 public class multhread2 {
28     public static void main(string[] args) {
29         
30         sub sub = new sub();
31         
32         thread t1 = new thread(sub);//将runnable接口的实现类对象作为参数,传给thread构造器
33         thread t2 = new thread(sub);
34         
35         t1.setname("one####");
36         t2.setname("two....");
37         
38         t1.start();
39         t2.start();
40     }
41 }

 

注:希望与各位读者相互交流,共同学习进步。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网