Java多线程

Java多线程

一、进程与线程

 首先我们需要理解,什么是线程、什么是进程?
在日常生活中,许多事情可以同时进行,例如一个人可以同时听课、玩游戏、甚至是写高数。在应用程序中,不同的程序块也是可以同时运行的,这种多个程序块同时运行的现象被称作并发执行。

    那么,什么是进程呢?简单地说,每一个运行中的程序都是一个进程。什么是线程呢?每个进程都需要至少一条执行线索去执行相应的功能,这条“线索”可以被称作线程,如最简单的情况就是,一个java程序只有一个main方法,这个main方法就是一条执行线索,就是一个线程。当然,这样的执行效率不高,我们需要多个执行线索去执行我们的程序,由此衍生出多线程。

 

二、并发与串行

    在生活中,大家去商城买东西,大家可以同时进行购物,这就是并发执行,而在结账时,大家需要排队吧,一个人结完账后再到另一个人结账,这个时候就是串行执行。

三、线程安全问题:

    如上面的例子,一坨人一起买东西会产生不安全的现象,如偷东西,因为我们无法监管到每一个人,不能保证每个人都是像作者这样的优秀四有青年害羞,这就是并发安全问题,这时候要“上锁”,简单地说就是串行化,让一个人接着一个人去买,里边有人监督这个人,这个人买完了就去结账,该回家回家,该去哪去哪,而下一个人在接着重复这样的动作,就能避免并发安全。

三、什么是多线程

    多线程就是指一个应用程序中可以有许多并发执行的线索,每条线索都被称之为一个线程。

 

四、线程的创建

    第一种方式:用自定义线程去继承Thread类,然后再调用它

public class MyThread extends Thread{


    //重写run方法,方便被调用

    @Override

    public void run() {

        for(int i = 0;i < 10;i++){

        System.out.println("MyThread线程正在执行...");

    }

}
public class ThreadTest {

    public static void main(String[] args) {

        //创建MyThread这个线程

        MyThread myThread = new MyThread();

        //启动这个线程中的run方法

        myThread.start();

        //用main线程输出一条语句

        for(int i = 0;i < 10;i++){

        System.out.println("main线程正在执行...");

        }

    }

}

输出的结果:

可以发现,主线程和MyThread线程是同时执行的,如果不使用多线程,而是使用单线程,如下:

public class ThreadTest {

    public static void main(String[] args) {

        //创建MyThread这个对象

        MyThread myThread = new MyThread();

        //启动这个线程中的run方法

        myThread.run();

        //用main线程输出一条语句

        for(int i = 0;i < 10;i++){

        System.out.println("main线程正在执行...");

        }

    }

}

在代码中我们仅把MyThread这个类当做普通类来使用,我们会发现程序会顺序执行,即当MyThread的run方法执行完后,才会继续执行main这个线程的输出方法

 

第二种实现方式:让自定义线程类去实现Runnable接口,并实现run方法

以下是经典的购票例子
​​​​​​​

public class TicketThread extends Thread{

    //定义100张票

    private Integer tickets = 100;

    @Override

    public void run() {

        while(tickets > 0){

        //获取当前线程的名字

        String current_thread = Thread.currentThread().getName();

        //模拟售票

        System.out.println(current_thread+"正在出售第"+tickets--+"张票");

        }


    }

}
public class BuyTicketsTest {


    public static void main(String[] args) {

    TicketThread tr = new TicketThread();

        //创建5个TicketThread线程并命名,开启并执行线程

        new Thread(tr,"窗口1").start();

        new Thread(tr,"窗口2").start();

        new Thread(tr,"窗口3").start();

        new Thread(tr,"窗口4").start();

        new Thread(tr,"窗口5").start();

    }

}

从执行结果中我们可以看到,线程之间互不干扰,各自执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值