Java多线程详解之一:线程创建

一、线程、进程、多线程

1、线程与进程定义

  • 进程:进程是系统进行资源分配和调度的基本单位,是操作系统中一个运行的程序,是线程的容器;
  • 线程:线程是处理机调度的最小单位,包含在进程中,是进程中实际运作单位;

一个例子:比如说我们的华为手机,操作系统是安卓,手机里的应用是进程,比如微信,而微信里的发语音、发文字、拍一拍等功能就是一个个线程。

2、线程与进程的区别

  • 调度:线程是处理机调度的基本单位,进程是资源分配的基本单位;
  • 拥有资源:进程拥有独立的资源,线程不拥有资源,但可以共享其隶属的进程资源;
  • 系统开销:进程>>线程;
  • 关系:进程包含线程,线程被包含在进程中,即一个线程只能属于一个进程,但一个进程可以有多个线程,且至少有一个线程,如下图所示:

 

 

二、单线程与多线程的区别

  单线程是一个程序顺序的执行事务,而多线程是一个程序可以同时执行多个事务,如下图

  

 

  对于单线程,我们必须顺序执行事务,先执行eat(),执行完eat()后,再执行watchTV(),就好比你有一个严格的妈妈,他不允许你边吃饭边看电视,必须吃过饭后才可以去看电视;

  对于多线程,我们可以在执行eat()的时候,同时开始执行watchTV(),就好比你有一个宽容的妈妈,他允许你边吃饭边看电视;

 

三、Java线程创建

 

 

 

 

 1、继承Thread类实现多线程【重点】

  • 自定义一个线程类,并继承Thread类
  • 重写Thread类中run()方法,编写线程执行体
  • 创建线程对象,调用start()方法以启动线程
//1.创建线程类,并继承Thread类
public class TestThread extends Thread{

    //2.重写Thread类的run()方法
    @Override
    public void run() {
        for(int i = 0; i < 20; i++){

            //currentThread方法是Thread类的一个方法,用于获取当前线程
            System.out.println(Thread.currentThread().getName()+"-->"+i);
        }
    }

    public static void main(String[] args) {
        //3.新建线程类对象
        TestThread thread1  = new TestThread();
        TestThread thread2  = new TestThread();
        TestThread thread3  = new TestThread();

        //4.调用start()方法(继承自Thread类)
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

 

2、实现Runnable接口【重点】

 

  • 创建线程类,并实现Runnable接口
  • 重写Runnable接口的run()方法
  • 创建线程类对象
  • 创建Thread类对象,并将线程类对象作为Thread构造器的参数
  • 调用Thread对象的start()方法
//1.创建线程类,并实现Runnable接口
public class TestRunnable implements Runnable{

    //2.重写Runnable的run()方法
    @Override
    public void run() {
        for(int i = 0; i < 20; i++){

            //currentThread方法是Thread类的一个方法,用于获取当前线程
            System.out.println(Thread.currentThread().getName()+"-->"+i);

        }
    }


    public static void main(String[] args) {
        //3.创建线程类对象
        TestRunnable thread = new TestRunnable();

        //4.创建Thread对象,传入线程类对象作为Thread构造器参数
        Thread thread1 = new Thread(thread);
        Thread thread2 = new Thread(thread);
        Thread thread3 = new Thread(thread);

        //5.调用每个Thread对象的start()方法
        thread1.start();
        thread2.start();
        thread3.start();
    }
}

 

3、实现Callable接口【了解】

  • 新建线程类实现Callable接口
  • 重写Callable接口的call()方法
public class MyThread implements Callable<String> {
    private int count = 20;
 
    @Override
    public String call() throws Exception {
        for (int i = count; i > 0; i--) {

            System.out.println(Thread.currentThread().getName()+"当前票数:" + i);
        }
        return "sale out";
    } 
 
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        Callable<String> callable  =new MyThread();
        FutureTask <String>futureTask=new FutureTask<>(callable);
        Thread mThread=new Thread(futureTask);
        Thread mThread2=new Thread(futureTask);
        Thread mThread3=new Thread(futureTask);

        mThread.start();
        mThread2.start();
        mThread3.start();
        System.out.println(futureTask.get());
        
    }
}

 

注:创建线程的三种方法中,1)继承Thread类 以及2)实现Runnable方法 是重点需要掌握的方法,3)实现Callable 作为了解即可,在开发中应用较少。

 

 

 


 

欢迎关注微信公众号,不定期分享学习笔记与资料,与Mike一起学java,谢谢~

posted @ 2020-11-24 18:31  Mike小菜鸡  阅读(143)  评论(0)    收藏  举报