JAVA学习笔记——JAVA基础语法--线程(九)

一、JAVA的多线程

  1、进程:在操作系统中一个可执行文件就是一个进程。DOS操作系统就是单用户单进程的操作系统;Windows是属于多用户多进程的操作系统

  2、CPU时钟管理器:是计算机操作系统中最核心的模块。他相当于把一秒钟分为很多份,然后可以分别执行各个程序

  3、线程:一个进程中的多条路径

二、实现多线程的两种方法:

  1、写一个自己的线程类实现Runable接口,在main()方法里面使用Thread这个类分配新的一个实现了Runnable接口的 Thread 对象,然后调用start方法开启线程。

  如下代码所示:

import java.lang.*;

public class test{

   public static void main(String[] args) throws Exception{

            Thread t1 = new Thread(new MyThread("m1"));
            t1.start(); 
            Thread t2 = new Thread(new MyThread("m2"));
            t2.start(); 
   }       
}
class MyThread implements Runnable{

   public MyThread(String name){

            this.name = name;
   }
   String name;  

   public void run(){

            for(int i = 0; i < 100;i++){

                     System.out.println(name + ":" + i);

            }

   }

}

   2、写一个类直接继承至Thread这个类,然后在main()方法里面直接将我们写的类实例化然后调用start()这个方法实现功能。

  如下这个程序代码:

import java.lang.*;

public class test{

   public static void main(String[] args) throws Exception{

            MyThread t1 = new MyThread("m1");
            t1.start(); 

            MyThread t2 = new MyThread("m2");
            t2.start(); 
   }       
}

class MyThread extends Thread{

   public MyThread(String name){

            this.name = name;

   }
   String name;
   public void run(){

            for(int i = 0; i < 100;i++){

                     System.out.println(name + ":" + i);

            }
   }
}

 

  两个实现多线程方法的个人总结

  既然有两个实现线程的方法,那么我们在现实编程当中该选用哪一种呢?我们从代码上来看可能会说第二中比较好,因为在创建对象的时候比较简单。但是实际上要第一种方法比较实用,因为我们知道JAVA是单继承的,如果我们自己写的这个线程类已经继承了一个类那么就不能在实现接口了,然而JAVA可以多实现,也就是说可以同时实现多个接口,这样的话就可以根据我们自己的需要适当的增加我们的线程类的功能,综上我们就显然的可以知道第一种实现Runnable接口的方法比较好比较实用。

  下面我们用一个流程图来形象的描述一下线程的执行过程:

JAVA学习笔记——JAVA基础语法--线程(九)_第1张图片

三、线程同步

 

  1、概念:就是说多个线程同时访问一个文件

 

    知识扩展:怎么解决这个线程问题呢?

    唯一的办法就是给线程加锁。只有当线程执行完毕之后自动解锁然后别的线程就可以对其进行访问。

 

  2、给线程加锁的关键字是synchronized,加锁的方法有两种:

 

    1)、  把这个关键字加在方法上,只要执行了这个m方法,就会锁住调用这个m方法的对象。当执行完方法体之后自动解锁

 

    2)、    在一个方法里面再用关键字写一个方法,可以把具体的属性传给他,这样的话就可以对具体的给某一个属性加锁。

 

以下就是使用第二种方法模拟的一个线程死锁的源程序

 

import java.lang.*;

public class test{

   public static void main(String[] args) throws Exception{

                    Thread t1= new Thread(new MyThread("t1"));
                    t1.start();

                    Thread t2 = new Thread(new MyThread("t2"));
                    t2.start();
   }       
}
class MyThread implements Runnable{

   static Object o1 = new Object();
   static Object o2 = new Object();
   String name;
   MyThread(String name){

            this.name = name;

   }

   public void run(){

            if("t1".equals(name)){

                     synchronized(o1){

                               System.out.println("线程t1锁住了o1");

                               synchronized(o2){

                                        System.out.println("线程t1锁住了o2");
                               }
                     }
            }

            if("t2".equals(name)){

                     synchronized(o2){

                               System.out.println("线程t2锁住了o2");

                               synchronized(o1){

                                        System.out.println("线程t2锁住了o1");

                               }
                     }
            }
   }
}

你可能感兴趣的:(java基础)