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多线程----线程的生命周期

        

      

      

  • 相关阅读:
    一个简单XQuery查询的例子
    《Microsoft Sql server 2008 Internals》读书笔记第七章Special Storage(1)
    《Microsoft Sql server 2008 Internals》读书笔记第八章The Query Optimizer(4)
    《Microsoft Sql server 2008 Internal》读书笔记第七章Special Storage(4)
    SQL Server中SMO备份数据库进度条不显示?
    《Microsoft Sql server 2008 Internal》读书笔记第七章Special Storage(5)
    《Microsoft Sql server 2008 Internal》读书笔记第七章Special Storage(3)
    《Microsoft Sql server 2008 Internal》读书笔记第八章The Query Optimizer(2)
    省市三级联动的DropDownList+Ajax的三种框架(aspnet/Jquery/ExtJs)示例
    FireFox意外崩溃时的手工恢复命令
  • 原文地址:https://www.cnblogs.com/wangxiaoce/p/6443397.html
Copyright © 2011-2022 走看看