线程

一、什么是多线程

  进程可以简单的理解为一个可以独立运行的程序单位。它是线程的集合,进程就是有一个或多个线程构成的,每一个线程都是进程中的一条执行路径

  多线程就可以理解为:一个进程中同时又多个执行路径(线程)正在执行 

为什么要是用多线程?

  1.在一个程序中,有很多的操作是非常耗时的,如数据库读写操作,IO操作等,如果使用单线程,那么程序就必须等待这些操作执行完成之后才能执行其他操作。使用多线程,可以在将耗时任务放在后台继续执行的同时,同时执行其他操作。

  2.可以提高程序的效率。

  3.在一些等待的任务上,如用户输入,文件读取等,多线程就非常有用了。

  缺点:

  1.使用太多线程,是很耗系统资源,因为线程需要开辟内存。更多线程需要更多内存。

  2.影响系统性能,因为操作系统需要在线程之间来回切换。

  3.需要考虑线程操作对程序的影响,如线程挂起,中止等操作对程序的影响。

  4.线程使用不当会发生很多问题。

  总结:多线程是异步的,但这不代表多线程真的是几个线程是在同时进行,实际上是系统不断地在各个线程之间来回的切换(因为系统切换的速度非常的快,所以给我们在同时运行的错觉)

二、线程的创建

线程创建的方法:

  1. 创建一个Thread类,或者一个Thread子类的对象

    Thread类是一个线程类,位于java.lang包下

构造方法 

常用方法

 

  2.创建一个实现Runnable接口的类的对象

    只有一个方法run();

    Runnable是Jave中用以实现线程的接口

    任何实现线程功能的类都必须实现该接口

代码:通过继承Thread类的方式创建线程类,重写run()方法

package com.mpp.thread;

//定义一个类继承Thread,实现run方法
class MyThread extends Thread{
    public void run(){
        System.out.println(getName()+"这个线程正在执行!");
    }
}
public class ThreadTest {
    public static void main(String[] args) {
//        System.out.println("主线程1");
        MyThread mt = new MyThread();
        mt.start();  //启动线程(注意:1.一个线程只能执行一次;2.启动线程用stat,执行run中的代码,而不是调用run方法)
//        System.out.println("主线程2");
//        mt.start(); 编译ok执行异常
    }
}

代码二:通过实现Runnable接口的方式创建线程

为什么要实现Runnable接口?

--Java不支持多继承

--不打算重写Thread类的其他方法

package com.mpp.runnable;

class PrintRunnable implements Runnable{
    int i= 1;   //t1h和t2一共执行10次
    @Override
    public void run() {
//        int i = 1;  //t1和t2一共执行20次,各执行10次
        while (i<10)
        System.out.println(Thread.currentThread().getName()+"正在运行"+i++);
    }
}
public class Test {
    public static void main(String[] args) {
        PrintRunnable pr = new PrintRunnable();//创建PrintRunnable对象
        Thread t1 = new Thread(pr);  //创建Thread对象,并把pr传入
        t1.start();//启动线程

//        PrintRunnable pr1 = new PrintRunnable();//创建PrintRunnable对象
        Thread t2 = new Thread(pr);  //创建Thread对象,并把pr传入
        t2.start();//启动线程
    }
}

 

三、线程的状态和生命周期

1. 线程的状态

  -新建(New)

  -可运行(Runnable)

  -正在运行(Running)

  -阻塞(Blocked)

  -终止(Dead)

2. 线程的生命周期

(1)sleep方法的使用

package com.mpp.runnable;

class MyThread implements Runnable{
    @Override
    public void run() {
        for(int i=0;i<30;i++){
            System.out.println(Thread.currentThread().getName()+"执行第"+i+"次!");
            try{
            Thread.sleep(1000);
            }
            catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}
public class SleepDemo {
    public static void main(String[] args) {
        MyThread mt = new MyThread();
        Thread t = new Thread(mt);
        t.start();
        Thread t1 = new Thread(mt);
        t1.start();
    }
}

 

 

四、线程调度

五、同步与死锁

 

posted @ 2019-02-24 00:08  青青子佩-  阅读(174)  评论(0编辑  收藏  举报