JAVA多线程学习

一、线程与进程


1、线程:程序中单独顺序的控制流
线程本身是依靠程序进行运行,线程是程序中的顺序控制流,只能使用分配给程序的资源和环境。
2、进程:执行中的程序
一个进程可以包含一个或多个线程,即至少包含一个线程。
3、单线程:程序中只存在一个线程,实际上主方法(main函数)就是一个主线程。
4、多线程:多线程是在一个程序中运行多个任务,其目的是更好的使用CPU资源。


二、线程的实现


1、JAVA中,线程的实现有2种:

  • 继承Thread类
  • 实现Runnable接口

2、Thread类
Thread类是在java.lang包中定义的,继承和Thread类必须重写run()方法。如下:

    public class className extends Thread{
        run();//需重写
        }

3、Runnable接口 如下:

    public class className Implements Runnnable{
             代码块
         }

注意:
启动线程需调用start(),并不是调用run()方法,run()其实就是一个线程的入口
如下:


  //定义MyThread类,继承Thread类
  public class MyThread extends Thread{
       private String name;
       public MyThread(String name){//构造方法传参,标识当前的线程
           this.name = name;
       }
       //重写run()方法
       public void run(){
           for(int i = 0; i < 100; i++){
               System.out.println(name + ":" + i);
           }

       }
  }
  public class ThreadDemo{

    public static void main(String[] args){
        MyThread t = new MyThread("A");
        t.start();
  }
}

无论是继承Thread类还是实现Runnable接口都需要重写run方法,但是Runnable这个接口没有Thread类中的start(),所以要通过Thread类中的start()来启动线程。如下:


 //定义MyRunnable类实现Runnable接口  
 public class MyRunnable implements Runnable{
        private String name;
        public MyRunnable(String name){
            this.name = name;
        }
        public void run(){
            for(int i = 0; i < 100; i++){
                System.out.println(name + ":" + i);
           }
        }
    }
public class RunnableDemo{

    public static void main(String[] args){
        MyRunnable r = new MyRunnable("B");//创建对象
        //通过Thread启动线程
        Thread t = new Thread(r);
        t.start();
  }
}

三、线程的状态
线程有固定的操作状态

  • 创建状态:准备好了一个多线程的对象

  • 就绪状态:调用了start()方法,等待CPU进行调度(即分配资源)

  • 运行状态:执行run()方法

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

  • 终止状态(死亡状态):线程销毁

四、线程的常用方法
线程的常用方法基本都在Thread类当中,所以大多通过Thread类调用。
1、取得线程名称

getName()

2、取得当前线程对象

currentThread()

3、判断线程是否启动

isAlive()

4、线程的强行运行

join()

5、线程的休眠

sleep()

6、线程的礼让

field()

五、同步与死锁
1、同步代码块
在代码块上加上”synchronized”关键字,则此代码块就称为同步代码块
2、同步代码块格式:

synchronized(同步对象){
需要同步的代码块;
}

3、同步方法
除了代码块可以同步,方法也是可以同步的

格式:

synchronized void 方法名(){}

六、线程优先级

优先级顺序设置:

  • 1-MIN_PRIORITY
  • 10-MAX_PRIORITY
  • 5-NORM_PRIORITY

如果什么都不设置默认值是5。调用Thread类里的setPriority()即可选择优先级大小。
注意:
线程的优先级会影响线程的执行顺序,这里指的是有可能影响,不会一定影响。
如下:

        //以下是主函数里设置了优先级,C最大B次之A最小
        Thread t1 = new Thread(new ThRun(),"A");
        Thread t2 = new Thread(new ThRun(),"B");
        Thread t3 = new Thread(new ThRun(),"C");
        t1.setPriority(Thread.MIN_PRIORITY);
        t2.setPriority(Thread.NORM_PRIORITY);
        t3.setPriority(Thread.MAX_PRIORITY);
        t1.start();
        t2.start();
        t3.start();

可以看到第一、二趟是B最先执行而不是C,之后的三趟才是C最先,因此优先级有可能影响,不会一定影响

B:0
A:0
C:0
B:1
C:1
A:1
C:2
B:2
A:2
C:3
B:3
A:3
C:4
B:4
A:4

你可能感兴趣的:(Java)