JAVA 多线程

多线程


 

多线程介绍

  进程: 正在运行的程序。一个应用程序在内存中的执行区域

  线程:进程中的一个执行单元,执行路径。负责当前进程中程序的执行

        一个进程可以有一个线程,也可以有多个线程

  简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程

 

单线程:安全性高,效率低

多线程:安全性低,效率高

单线程程序:若有多个任务只能依次执行。当上一个任务执行结束后,下一个任务开始执行。如先刷牙然后再洗脸最后洗澡。

多线程程序:若有多个任务可以同时执行。如刷牙洗脸加洗澡。

 

创建线程的目的是什么?

是为了建立程序单独的执行路径,让多部分代码实现同时执行。也就是说线程创建并执行需要给定线程要执行的任务。


 

多线程的实现

方式一:

1.定义一个类继承Thread。

2.重写run方法。

3.创建子类对象,就是创建线程对象。

4.调用start方法,开启线程并让线程执行,同时还会告诉jvm去调用run方法

public class ThreadDemo01 {

    public static void main(String[] args) {
        //创建线程实例
     Student s
= new Student();     //修改线程名字 s.setName("wdnmd");
    //启动线程 s.start();      Student s2
= new Student();      s2.setName("xswl"); s2.start(); } } class Student extends Thread{ @Override public void run(){ for (int i = 0; i < 100; i++) { System.out.println(getName()+"---"+i); } } }

方式二:

创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后创建Runnable的子类对象,传入到某个线程的构造方法中,开启线程。

Runnable接口用来指定每个线程要执行的任务。包含了一个 run 的无参数抽象方法,需要由接口实现类重写该方法。

1、定义类实现Runnable接口。

2、覆盖接口中的run方法。。

3、创建Thread类的对象

4、将Runnable接口的子类对象作为参数传递给Thread类的构造函数。

5、调用Thread类的start方法开启线程。

public class MyThread implements Runnable {

    int num;

    public MyThread(int num) {
        this.num = num;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println( Thread.currentThread().getName() + "------"+ i +num );
        }
    }
}
public static void main(String[] args) {

        MyThread mt = new MyThread(100);
        Thread t = new Thread(mt);
        t.setName("WDNMD");
        t.start();

        Thread t2 = new Thread(mt);
        t2.setName("XSWL");
        t2.start();

    }

同步代码块

格式:
  synchronized(锁对象){
      //需要同步的代码
}

synchronized:同步(锁),可以修饰代码块和方法,被修饰的代码块和方法一旦被某个线程访问,则直接锁住,其他的线程将无法访问

锁对象需要被所有的线程所共享

    同步:安全性高,效率低

    非同步:效率高,但是安全性低

 

同步方法:使用关键字synchronized修饰的方法,一旦被一个线程访问,则整个方法全部锁住,其他线程则无法访问

synchronized

注意:

  非静态同步方法的锁对象是this

  静态的同步方法的锁对象是当前类的字节码对象

public class TicketThread implements Runnable {
    static int tickets = 100;//火车票数量
    Object obj = new Object();

    @Override
    public void run() {
        //出售火车票
        while(true) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            method();
        }
    }
private static synchronized void method() {
        if(tickets > 0) {
            System.out.println(Thread.currentThread().getName() + ":" +tickets--);
        }
    }
}

 

posted on 2019-08-27 23:12  viper23333  阅读(111)  评论(0编辑  收藏  举报