java基础-线程

一. 线程的概述
进程:正在运行的程序,负责了这个程序的内存空间分配,代表了内存中的执行区域。
线程:就是在一个进程中负责一个执行路径。
多线程:就是在一个进程中多个执行路径同时执行。

多线程的好处:
1.解决了一个进程里面可以同时运行多个任务(执行路径)。
2.提供资源的利用率,而不是提供效率

多线程的弊端:
1.降低了一个进程里面的线程执行频率。
2.对线程进行管理 要求额外的CPU开销,线程的使用会给系统带来上下文切换的额外负担。
3.公有变量的同时读或写,当多个线程需要对公有变量进行写操作时,后一个线程会修改掉前一个线程存放的数据,发生线程安全问题。
4.线程的死锁,即较长时间的等待或者资源竞争以及死锁等多线程症状

二. 创建线程的方式
(1) 方式一
1.自定义一个类继承Thread类
2.重写Thread 类的run方法,把自定义线程的任务代码写在run方法中。
重写run方法的目的是:因为每个线程都有自己的任务代码,jvm创建的主线程的任务代 码就是main方法中的所有代码,自定义线程的任务代码就是写在run方法中,自定义线程 负责了run方法的执行
3.创建Thread的子类对象,并且调用start方法开启线程。
注意:一个线程一旦开启,那么线程就会执行run方法中的代码,run方法千万不能直接调用,直接调用run方法就相当于调用了一个普通方法,并且没有开启新的线程


图片.png

(2)方式二

/*
实现线程的第二种方式


方式二:
    1. 自定义一个类实现Runnable接口。
    2. 实现Runnable接口 的run方法,把自定义线程的任务定义在run方法上。
    3. 创建Runnable实现类对象。
    4. 创建Thread类 的对象,并且把Runnable实现类的对象作为实参传递。
    5. 调用Thread对象 的start方法开启一个线程。


问题1: 请问Runnable实现类的对象是线程对象吗?
Runnable实现类的对象并 不是一个线程对象,只不过是实现了Runnable接口 的对象而已。
只有是Thread或者是Thread的子类才是线程 对象。

问题2: 为什么要把Runnable实现类的对象作为实参传递给Thread对象呢?作用是什么?
作用就是把Runnable实现类的对象的run方法作为了线程的任务代码去执行了。

推荐使用: 第二种。 实现Runable接口的。 
原因: 因为java单继承 ,多实现的。
*/




class SaleTicket implements Runnable{

    int  num = 50; // 票数

    @Override
    public void run() {
        while(true){
            synchronized ("锁") {
                if(num>0){
                        System.out.println(Thread.currentThread().getName()+"售出了第"+ num+"号票");
                num--;
                }else{
                    System.out.println("售罄了..");
                    break;
                }   
            }
        }       
    }
}
public class Thread_05  {


    public static void main(String[] args) {
    
    
                //创建了一个Runnable实现类的对象
                SaleTicket saleTicket = new SaleTicket();
                //创建三个线程对象模拟三个窗口  ,,创建Thread类的对象, 把Runnable实现类对象作为实参传递。
                Thread thread1 = new Thread(saleTicket,"窗口1");
                Thread thread2 = new Thread(saleTicket,"窗口2");
                Thread thread3 = new Thread(saleTicket,"窗口3");
                //调用thread对象的start方法开启线程。开启线程售票
                thread1.start();
                thread2.start();
                thread3.start();    
    
    
    } 


}

你可能感兴趣的:(java基础-线程)