java - 多线程,锁

1.继承Thread
	  * 定义类继承Thread
	  * 重写run方法
	  * 把新线程要做的事写在run方法中
	  * 创建线程对象
	  * 开启新线程, 内部会自动执行run方法
		
			  public class Demo2_Thread {
				    public static void main(String[] args) {
					      MyThread mt = new MyThread();	  						//4,创建自定义类的对象
					      mt.start();	  											//5,开启线程
					
					      for(int i = 0; i < 3000; i++) {
						      System.out.println("bb");
					      }
				    }
  }
			  class MyThread extends Thread {	  								//1,定义类继承Thread
				    public void run() {	  										//2,重写run方法
					    for(int i = 0; i < 3000; i++) {	  						//3,将要执行的代码,写在run方法中
						    System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
					    }
				  }
			}
* 2.实现Runnable
	  * 定义类实现Runnable接口
	  * 实现run方法
	  * 把新线程要做的事写在run方法中
	  * 创建自定义的Runnable的子类对象
	  * 创建Thread对象, 传入Runnable
	  * 调用start()开启新线程, 内部会自动调用Runnable的run()方法
			  public class Demo3_Runnable {
				    public static void main(String[] args) {
					      MyRunnable mr = new MyRunnable();	  					//4,创建自定义类对象
					      //Runnable target = new MyRunnable();
					      Thread t = new Thread(mr);	  							//5,将其当作参数传递给Thread的构造函数
					      t.start();	  											//6,开启线程
					
					      for(int i = 0; i < 3000; i++) {
						        System.out.println("bb");
					      }
				    }
			  }
			
			  class MyRunnable implements Runnable {	  						//1,自定义类实现Runnable接口
				    @Override
				    public void run() {	  										//2,重写run方法
					      for(int i = 0; i < 3000; i++) {	  						//3,将要执行的代码,写在run方法中
						        System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaaaa");
					      }
				    }
  }

匿名内部类:

 


Java中守护线程的总结
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:
只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。
User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。

Java中join()方法的理解
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。
比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。
t.join(); //调用join方法,等待线程t执行完毕
t.join(1000); //等待 t 线程,等待时间是1000毫秒。
Java线程中yield()的用法
Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他线程。(可能没有效果)
yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会。因此,使用yield()的目的是让具有相同优先级的线程之间能够适当的轮换执行。但是,实际中无法保证yield()达到让步的目的,因为,让步的线程可能被线程调度程序
再次选中。
结论:大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。




锁对象要唯一的, this代表实例这个对象,每个线程都会实例对象,导致不是唯一。 类.class 唯一
                    
                
                
            
        
浙公网安备 33010602011771号