Java基础二十二

1 多线程的概述

1.1 进程

  • 就是正在运行的程序。是系统进行资源分配和调度的独立单位。每一个进程都有其自己的内存空间和系统资源。

1.2 多进程的意义?

  • 单进程的计算机只能做一件事情,而我们现在的计算机可以做多件事情。例如:一边玩游戏,一边听音乐。
  • 现在的计算机都支持多进程的,就可以一个时间段内执行多个任务,并且可以提高CPU的使用率。

1.3 线程

  • 在一个进程内又可以执行多个任务,而这每一个任务我们就可以看成是一个线程。
  • 线程是进程的执行单元(执行路径)。
  • 单线程:如果程序有一条执行路径。
  • 多线程:如果程序有多条执行路径。

1.4 多线程的意义?

  • 多线程的存在,不是提高程序的执行速度。其实是为了提高应用程序的使用率。
  • 程序的执行其实都是在抢CPU的资源,即CPU的执行权。
  • 多个进程是在抢这个资源,而其中的某一个进程如果执行路径比较多的话,就有更高的几率抢到CPU的执行权。
  • 线程的执行具有随机性。

1.5 Java程序的运行原理

  • Java命令会启动Java虚拟机,启动JVM,等于启动了一个进程。 该进程会自动启动一个主线程,然后由主线程去调用某个类的main方法,所以main方法运行在主线程中的。
  • JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的。

2 多线程的实现方案

2.1 多线程的实现方案一

  • 步骤:
  • ①创建一个类去继承Thread类。
  • ②该子类去重写run()方法。
  • ③创建该子类的对象。
  • ④启动线程
  • 示例:
package com.xuweiwei;

/**
 * 多线程的实现:
 *  由于线程是依赖进程而存在的,所以我们应该先创建一个进程出来。
 *  而进程是由系统创建的,所以,我们应该去调用系统功能去创建一个进程。
 *  Java是不能直接带哦用系统功能的,所以,我们没有办法直接实现多线程程序。
 *  但是,Java是可以调用C或C++写好的程序去实现多线程程序。
 *  由C或C++去调用系统功能创建进程,然后由Java去调用这样的东西,然后提供一些API供我们使用。这样,我们就可以实现多线程程序了。
 */
public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"= " + i);
        }
    }
}
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        t1.start();

        MyThread t2 = new MyThread();
        t2.start();

    }
}

2.2 获取线程对象的名称和设置线程对象的名称

  • 方法:返回该线程的名称
public final String getName()
  • 方法:设置线程的名称
public final void setName(String name)
  • 方法:返回当前正在执行的线程对象的引用
public static Thread currentThread()
  • 示例:无参构造方法+setName
package com.xuweiwei;

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"= " + i);
        }
    }
}
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {

        MyThread t1 = new MyThread();

        MyThread t2 = new MyThread();

        //设置线程的名字
        t1.setName("t1");
        t2.setName("t2");

        t1.start();
        t2.start();

    }
}
  • 示例:有参构造方法
package com.xuweiwei;

public class MyThread extends Thread {

    public MyThread() {
    }

    public MyThread(String name) {
        super(name);
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"= " + i);
        }
    }
}
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {

        MyThread t1 = new MyThread("t1");

        MyThread t2 = new MyThread("t2");

        t1.start();
        t2.start();

    }
}
  • 示例:获取main方法所在的线程对象的名称
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {

        System.out.println(Thread.currentThread().getName());

    }
}

2.3 线程的控制

  • 方法:线程睡眠
public static void sleep(long millis)  throws InterruptedException
  • 方法:join线程,等待该线程终止
public final void join() throws InterruptedException
  • 方法:线程礼让即暂停当前的正在执行的线程对象,并执行其他线程。
public static void yield()
  • 方法:守护线程
public final void setDaemon(boolean on)
  • 方法:中断线程
public void interrupt()
  • 示例:
package com.xuweiwei;

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread().getName()+"= " + i);
        }
    }
}
  • 示例:
package com.xuweiwei;

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "= " + i);
        }
    }
}
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();

        t1.setName("李渊");
        t2.setName("李建成");
        t3.setName("李世民");

        t1.start();
        try {
            t1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t2.start();
        t3.start();


    }
}
  • 示例:
package com.xuweiwei;

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "= " + i);
            Thread.yield();
        }
    }
}
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {
        MyThread t1 = new MyThread();
        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();

        t1.setName("李渊");
        t2.setName("李建成");
        t3.setName("李世民");

        t1.start();
        t2.start();
        t3.start();


    }
}
  • 示例:
package com.xuweiwei;

public class MyThread extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "= " + i);
            Thread.yield();
        }
    }
}
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {

        MyThread t2 = new MyThread();
        MyThread t3 = new MyThread();

        t2.setName("李建成");
        t3.setName("李世民");

        t2.setDaemon(true);
        t3.setDaemon(true);


        t2.start();
        t3.start();

        Thread.currentThread().setName("李渊");
        for (int i = 0; i < 3; i++) {
            System.out.println(Thread.currentThread().getName()+"= " + i);
        }


    }
}

2.4 线程的生命周期

  • 新建:创建线程对象。
  • 就绪:有执行资格,但是没有执行权。
  • 运行:有执行资格,有执行权。
  • 阻塞:由于一些操作,让线程处于该状态。没有执行资格,没有执行权。
  • 死亡:线程对象对象变成垃圾,等待被回收。

2.5 多线程的实现方式二

  • 步骤:
  • ①声明一个类实现Runnable接口。
  • ②重写run()方法。
  • ③创建该类的对象。
  • ④在创建Thread将该类的对象作为参数传递并启动。
  • 示例:
package com.xuweiwei;

public class MyThread implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "= " + i);
        }
    }
}
package com.xuweiwei;

public class MyThreadTest {
    public static void main(String[] args) {
        MyThread t = new MyThread();

        Thread t1 = new Thread(t);
        t1.setName("线程1");

        Thread t2 = new Thread(t);
        t2.setName("线程2");

        t1.start();
        t2.start();



    }
}
  • 多线程实现接口的好处:
  • ①可以避免由于Java单继承带来的局限性。
  • ②适合多个相同程序的代码去处理同一个资源的情况,把线程同程序的代码、数据有效的分离,较好的体现了面向对象的设计思想。

2.6  多线程的应用

  • 示例:使用多线程实现方式二实现这样的需求:某电影院目前正在上映贺岁大片,共有100张票,而其有3个售票口售票,清设计一个程序模拟该电影院售票。

3 线程调度和线程控制

4 线程生命周期

5 死锁

6 线程间通信

7 定时器的使用

猜你喜欢

转载自www.cnblogs.com/xuweiweiwoaini/p/9410609.html
今日推荐