线程和多线程

本文详细介绍了线程和多线程的概念,包括进程与线程的区别,多线程的创建方式,如继承Thread类、实现Runnable接口、Callable接口以及使用线程池。重点讨论了线程安全问题,如synchronized关键字的同步代码块和同步方法,以及wait()和sleep()的区别。同时,提到了线程池的优势和线程安全的实现,最后讨论了lock(如ReentrantLock)在确保数据安全中的作用,并提及多线程在断点续传等难点应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程指的是程序执行的基本单位,程序由一个或者多个进程组成。线程指的是CPU执行的基本单位,进程是有一个或者多个线程组合合成。线程是由CPU调度执行,多线程是CPU不断地来回切换调度不同的线程执行的结果。

多线程的创建方式:1、自定义线程类继承Thread类,重写run()方法,main方法实例化自定义线程类,通过对象调用start()开启线程

                                    2、自定义任务类实现Runnable接口,重写run()方法,main方法实例化自定义任务类,实例化Thread类并在构造方法中传递任务类的对象,通过Thread类对象调用start()开启线程

                                    3、自定义类实现Callable接口,重写call(),拥有返回值

                                    4、通过线程池启动线程

public class Demo01 {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        //调用方法
        //myThread.run();
        //启动线程
        myThread.start();
    }
}

class MyThread extends Thread{
    @Override
    public void run() {
    }
}
public class Demo02 {
    public static void main(String[] args) {
        Task task = new Task();
        Thread thread = new Thread(task);
        thread.start();
    }
}

class Task implements Runnable{
    @Override
    public void run() {
    }
}

线程池可以实现线程的重复使用,减少线程的创建和销毁时间

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Demo04{
    public static void main(String[] args){
        /*//创建一条线程的线程池
        ExecutorService pool = Executors.newSingleThreadExecutor();
        //创建10条线程的线程池
        ExecutorService pool = Executors.newFixedThreadPool(10);
        //自带缓冲区的线程池
        ExecutorService pool = Executors.newCachedThreadPool();
        Task task = new Task();
        for(int i=0;i<10;i++){
            //把任务提交给线程池
            pool.submit(task);
        }
        //关闭线程池
        pool.shutdown();*/
    }
}
class Task implements Runnable{
    @Override
    public void run(){
            //Thread.currentThread().getName() 获取当前线程的名字
    }
}

线程的安全问题:多个线程同时访问异步临界资源,可能会造成数据混乱,因此需要给线程加上同步锁,同步锁分为两类:synchronize和lock。

synchronize:

一、同步代码块:需要同步的代码放在同步代码块中,添加同步锁和同步监视器。要求多个线程访问的时候,使用的是同一个对象的同步监视器,当有线程进入同步代码块,其他线程则会等待进入同步代码块的线程执行完毕后才会进入(案例一)

二、同步方法:被同步锁修饰的方法为同步方法,同步监视器为方法本身。当一条线程调用同步方法时,其他线程则会等待同步方法执行完毕再调用,要求方法为静态方法或者使用同一个对象(案例二)

 

        /*10个外星人电脑专售店,出售1000台外星人电脑
            第1家外星人电脑专售店出售第1台电脑
            第9家外星人电脑专售店出售第2台电脑
            第4家外星人电脑专售店出售第3台电脑
            第10家外星人电脑专售店出售第4台电脑
            第2家外星人电脑专售店出售第5台电脑
            ...
            第4家外星人电脑专售店出售第1000台电脑
            第4家外星人电脑专售店已售罄
            第2家外星人电脑专售店已售罄
            第1家外星人电脑专售店已售罄
            第9家外星人电脑专售店已售罄
            第10家外星人电脑专售店已售罄
            ...*/
//案例一
public class Demo01{
    public static void main(String[] args){
        for(int i = 1; i <= 10;i++){
            new MyThread("第"+i+"家
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值