Java分享笔记:创建多线程 & 线程同步机制
程序员文章站
2022-06-03 07:57:02
[1] 创建多线程的两种方式 1.1 通过继承Thread类创建多线程 1.定义Thread类的子类,重写run()方法,在run()方法体中编写子线程要执行的功能。 2.创建子线程的实例对象,相当于新建了一条子线程。 3.调用子线程的start()方法,子线程启动并执行run()方法中的功能。 1 ......
[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 }
注:希望与各位读者相互交流,共同学习进步。