Java学习笔记之多线程

创建多线程的方式:

1、继承Java.lang.Thread类

 

[java] view plain copy
 
 print?
  1. public class TestThread {  
[java] view plain copy
 
 print?
  1. public static void main(String[] args) {  
[java] view plain copy
 
 print?
  1. // 3.创建一个子类的对象  
[java] view plain copy
 
 print?
  1. SubThread st = new SubThread();  
[java] view plain copy
 
 print?
  1. // 4.调用线程的start()方法,启动此线程,调用相应的run()方法。  
[java] view plain copy
 
 print?
  1. st.start();  
[java] view plain copy
 
 print?
  1. </pre><pre name="code" class="java">        for (int i = 0; i < 100; i++) {  
[java] view plain copy
 
 print?
  1. System.out.println(i);  
[java] view plain copy
 
 print?
  1. System.out.println("我是主线程!");  
[java] view plain copy
 
 print?
  1. }  
[java] view plain copy
 
 print?
  1. }  
[java] view plain copy
 
 print?
  1. }  
[java] view plain copy
 
 print?
  1. </pre><pre name="code" class="java">// 1.创建一个集成于Thread的子类  
[java] view plain copy
 
 print?
  1. class SubThread extends Thread {  
[java] view plain copy
 
 print?
  1. // 2.重写Thread的run()方法。  
[java] view plain copy
 
 print?
  1. public void run() {  
[java] view plain copy
 
 print?
  1. for (int i = 0; i < 100; i++) {  
[java] view plain copy
 
 print?
  1. System.out.println(i);  
[java] view plain copy
 
 print?
  1. System.out.println("我是子线程");  
[java] view plain copy
 
 print?
  1. }  
[java] view plain copy
 
 print?
  1. }  
[java] view plain copy
 
 print?
  1. }  
Thread的常用方法:

①:start()启动线程,并执行相应的run()方法

②:run():子线程要执行的代码放入run()中

③:currentThread():静态的,调取当前的线程

④:getName():获取此线程的名字

⑤:setName():设置此线程的名字

⑥:yield():调用此方法的线程,释放当前CPU的执行权

⑦:join():在A线程中调用B线程的join()方法,表示:当执行到此方法时,A线程停止,执行B线程直到B线程执行完毕,A线程再接着join()之后的代码执行。

⑧:isAlive():判断当前线程是否还存活。

⑨:sleep(long l):显示的让当前线程睡眠l毫秒。

⑩:线程通讯:wait()、notify()、notifyAll()

2、通过实现的方式:实现Runnable接口

 

 

[java] view plain copy
 
 print?
  1. public class TestThread1 {  
  2.     public static void main(String[] args) {  
  3.         // 3.创建一个Runnable接口实现类的对象  
  4.         PrintNumber1 p1 = new PrintNumber1();  
  5.         // 4.将此对象作为形参传递给Thread类的构造器,创建Thread类对象,此对象即为一个线程  
  6.         Thread t1 = new Thread(p1);  
  7.         // 5.执行此线程的start()方法  
  8.         t1.start();  
  9.     }  
  10. }  
  11.   
  12. // 1.创建一个实现了Runnable接口的类  
  13. class PrintNumber1 implements Runnable {  
  14.     // 2.实现接口的抽象方法  
  15.     public void run() {  
  16.         // TODO Auto-generated method stub  
  17.         // 子线程执行的代码  
  18.         for (int i = 0; i < 100; i++) {  
  19.             System.out.println(Thread.currentThread().getName() + ":" + i);  
  20.         }  
  21.     }  
  22.   
  23. }  

 

 

对比一下继承方式与实现方式:

 

1.联系:public class Thread implements Runnable(Thread类也实现了Runnable接口)

2.哪个方式好?---->实现的方式优于继承的方式。WHY?  ①避免了java单继承的局限性。②如果多个线程要操作同一份资源(数据),更适合使用实现的方式。 

 

 

线程的生命周期:

线程安全问题:

 

1、线程安全问题存在的原因:

  由于一个线程再操作共享数据过程中,未执行完毕的情况下,另外的线程参与进来,导致共享数据存在了安全问题。

2、如何来解决线程安全问题:

必须让一个线程操作共享数据完毕以后,其它线程才有机会操作共享数据。

3、Java如何实现线程的安全:线程的同步机制。

 

 

方式一:同步代码块

synchronized(同步监视器){

        // 需要被同步的代码块(即为操作共享数据的代码)

}

1.共享数据:多个线程共同操作的同一个数据(变量)

2.同步监视器:由一个类的对象来充当,哪个线程获取此监视器,谁就执行大括号里被同步的代码。俗称:锁。

要求:所有的线程公用同一把锁!!

注:在实现的方式中,考虑同步的话可以考  用用this来充当锁,但在继承的方式中慎用!

方式二:同步方法

将操作共享数据的方法生命为synchonized。即此方法为同步方法,能够保证当其中一个线程执行此方法时,其它线程在外等待直至此线程执行完此方法。

注:同步方法的锁:this。

posted @ 2016-12-05 15:09  天涯海角路  阅读(78)  评论(0)    收藏  举报