java多线程---基础

时间:2023-02-16 08:11:51

一, java多线程----线程与进程

  进程: 程序(任务)的执行过程,拥有资源(共享内存,共享资源)和线程(一个或者多个,至少一个)。  例如:打开任务管理器,qq,chrome,都属于进程。

  线程:  系统中最小的执行单元,同一进程中有多个线程,线程共享进程的资源。       例如:qq的聊天发送消息。

      单线程:程序中只有一个线程,实际上主方法就是一个主线程。

   多线程:程序中运行多个任务,   目的是更好的使用cpu资源。

二,java多线程----线程的实现

  简单一句话来说,继承Thead类或者实现Runnable这个接口,然后重写里面的run方法。

继承Thead类

 1 public class MyThead extends Thread{
 2     
 3     private String name;
 4     public MyThead(String name) {
 5         this.name = name;
 6     }
 7     @Override
 8     public void run() {
 9         for (int i = 0; i < 1000; i++) {
10             System.out.println(name+"------"+i);
11         }
12     }
13 }

实现Runnable接口

 1 public class MyRunnable  implements Runnable{
 2     
 3     private String name;
 4     public MyRunnable(String name) {
 5         this.name = name;
 6     }
 7     @Override
 8     public void run() {
 9         for (int i = 0; i < 1000; i++) {
10             System.out.println(name+"----"+i);
11         }
12         
13     }
14 
15 }

启动线程

 1 public class TheadDemo {
 2 
 3     public static void main(String[] args) {
 4         MyThead t1 = new MyThead("t1");
 5         MyThead t2 = new MyThead("t2");
 6         
 7         t1.start();
 8         t2.start();
 9         
10         MyRunnable r1 = new MyRunnable("r1");
11         MyRunnable r2 = new MyRunnable("r2");
12         
13         Thread t3 = new Thread(r1);
14         Thread t4 = new Thread(r2);
15         
16         t3.start();
17         t4.start();
18     }
19 }

三,java多线程----线程的状态

   创建状态:创建多线程对象。

   就绪状态: 调用start(),等待cpu调用。

   运行状态: 执行run()。

   阻塞状态:暂时停止执行,将资源交给其他线程使用。

   终止状态:线程结束。

四,java多线程----常用的方法(thead类里面)

  获取当前线程的对象      currentThread()

  得到线程名称               getName()

  判断线程是否运行         isAlive()

  线程的强行运行            join()      例如:俩个线程t1,t2,    当在t1执行的时候,t2调用join()方法,t1暂停不执行,t2执行,执行完成后,释放资源,t1接着执行。

  线程的休眠                 sleep()    例如:t1每执行一次,等待5秒      t1.sleep(5000)

  线程的礼让                 yield()     例如:俩个线程t1,t2,    当在t1执行的时候,t1调用yield()方法,t1暂停不执行,t2执行,执行完成后,释放资源,t1接着执行。

五,java多线程---- 优先级

  MIN_PRIORITY     小

  MAX_PRIORITY    大

  NORM_PRIORITY  正常状态

  如果什么都不设置,默认是5

  线程的优先级其实可以影响线程的执行顺序,这里的影响是可能性的,有可能影响到了,也有可能没有 。

六,java多线程----同步与死锁

  同步的俩种方式,同步代码块,同步方法

  同步代码块格式

  synchronized( 同步的对象){

    同步的代码

  };

  同步方法

  public synchronized void 方法名(){

    同步的代码

  };

  例子:java代码实现火车站三个窗口进行卖票,如果没有同步的话,会怎么样,同步的话,又会出现怎么的情空呢?

  没有同步的代码

  

 1 class MyRun implements Runnable{
 2     //火车站有5张票
 3     private int ticket = 5;
 4     @Override
 5     public void run() {
 6         for (int i = 0; i < 10; i++) {
 7             if(ticket > 0){
 8                 try {
 9                     Thread.sleep(500);
10                 } catch (InterruptedException e) {
11                     e.printStackTrace();
12                 }
13                 System.out.println("车票:"+ticket--);
14             }
15         }
16     }
17 }
18 public class TheadDemo {
19 
20     public static void main(String[] args) {
21         MyRun run = new MyRun();
22         Thread t1 = new Thread(run, "窗口一");
23         Thread t2 = new Thread(run, "窗口二");
24         Thread t3 = new Thread(run, "窗口三");
25         
26         t1.start();
27         t2.start();
28         t3.start();
29     }
30 }

结果; 

  java多线程---基础

同步代码块实现代码

 1 class MyRun implements Runnable{
 2     //火车站有5张票
 3     private int ticket = 5;
 4     @Override
 5     public void run() {
 6         for (int i = 0; i < 10; i++) {
 7             synchronized (this) {
 8                 if(ticket > 0){
 9                     try {
10                         Thread.sleep(500);
11                     } catch (InterruptedException e) {
12                         e.printStackTrace();
13                     }
14                     System.out.println("车票:"+ticket--);
15                 }
16             }
17         }
18     }
19 }
20 public class TheadDemo {
21 
22     public static void main(String[] args) {
23         MyRun run = new MyRun();
24         Thread t1 = new Thread(run, "窗口一");
25         Thread t2 = new Thread(run, "窗口二");
26         Thread t3 = new Thread(run, "窗口三");
27         
28         t1.start();
29         t2.start();
30         t3.start();
31     }
32 }

结果:

java多线程---基础

结论:在多线程的情况下,为了确保资源准确,或者说数据的准确,我们必须使用线程同步。也就是说加synchronized关键字

死锁的概念-------所谓死锁是指多个进 程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

        http://c.biancheng.net/cpp/html/2604.html   可以看看该文章,里面解释的很清楚。

七,java多线程----线程的生命周期

java多线程---基础