zoukankan      html  css  js  c++  java
  • java多线程基础

    一, 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 }

    结果; 

      

    同步代码块实现代码

     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 }

    结果:

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

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

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

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

        

      

      

  • 相关阅读:
    HDU 1018.Big Number-Stirling(斯特林)公式 取N阶乘近似值
    牛客网 Wannafly挑战赛9 C.列一列-sscanf()函数
    牛客网 Wannafly挑战赛9 A.找一找-数据处理
    Codeforces 919 C. Seat Arrangements
    Codeforces Round #374 (Div. 2) D. Maxim and Array 线段树+贪心
    Codeforces Round #283 (Div. 2) A ,B ,C 暴力,暴力,暴力
    Codeforces Round #283 (Div. 2) E. Distributing Parts 贪心+set二分
    Codeforces Round #280 (Div. 2) E. Vanya and Field 数学
    Codeforces Round #280 (Div. 2) D. Vanya and Computer Game 数学
    Codeforces Round #280 (Div. 2) A , B , C
  • 原文地址:https://www.cnblogs.com/wangxiaoce/p/6443397.html
Copyright © 2011-2022 走看看