多线程(Java.Thread)学习

发布时间 2024-01-12 23:10:18作者: Only_Aptx-4869

多线程(Java.Thread)学习

线程简介:

1、线程是独立执行的路径
2、程序运行时有很多后台进程 比如主线程、young.gc、full.gc()
3、main是主线程,系统入口,用于执行整个程序
4、一个进程中、如果开辟多个线程,线程的运行由调度器安排调度、调度器的先后顺序不能人为干预
5、对同一份资源操作时,会存在资源抢夺问题,需要加入并发控制
6、线程会带来额外的开销,比如cpu调度时间,并发控制开销
7、每个线程在自己的工作内存交互,内存控制不当会造成数据不一致

线程实现:

Thread

/**
 * @Description:TODO
 * @Author:Administrator
 * @Create 2024/1/12
 */
public class ThreadTest extends Thread{
    // 线程入口点
    @Override
    public void run() {
        // 线程体
        for (int i = 0;i<10;i++){
            System.out.println("我在看蒂法....."+i);
        }
    }
    public static void main(String[] args) {
        ThreadTest threadTest = new ThreadTest();
            threadTest.start();//开启线程,不一定立即执行 需要cpu调度
            threadTest.run();//立即执行线程 
        for (int i =0;i<10;i++){
            System.out.println("我在学Java Thread"+i);
        }
    }
}

开启 Thread 线程 下载网图,验证start方法线程执行交给cpu。

public class ThreadTest2 extends Thread {
    private String url;
    private String name;

    public ThreadTest2(String url,String name){
        this.url = url;
        this.name =name;
    }
    @Override
    public void run() {
        WebDownloader webDownloader = new WebDownloader();
        webDownloader.download(url,name);
        System.out.println("下载了文件名为:"+name);
    }
    public static void main(String[] args) {
        ThreadTest2 threadTest1 = new ThreadTest2("https://aistyle.art/assets/files/2023-06-30/1688166112-995353-348703237-145251275241612-1956428239713994473-n.jpg","明日香1.jpg");
        ThreadTest2 threadTest2 = new ThreadTest2("https://bkimg.cdn.bcebos.com/pic/8b13632762d0f703918fecd9c0b1463d269759ee6f28?x-bce-process=image/format,f_auto/resize,m_lfit,limit_1,h_300","明日香2.jpg");
        ThreadTest2 threadTest3 = new ThreadTest2("https://aistyle.art/assets/files/2023-06-30/1688166112-995353-348703237-145251275241612-1956428239713994473-n.jpg","明日香3.jpg");

        threadTest1.start();
        threadTest2.start();
        threadTest3.start();
    }
}
class WebDownloader{
    //
    public void download(String url,String name){
        try{
            FileUtils.copyURLToFile(new URL(url),new File(name));
            System.out.println("下载完成");
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

实现runable接口

public class TestThread3 implements Runnable {
    public static void main(String[] args) {
        TestThread3 testThread3 = new TestThread3();
        new Thread(testThread3).run();

        for (int i = 0; i < 10; i++) {
            System.out.println("我在学习" + i);
        }
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("我在聊天" + i);
        }
    }
}

初识并发问题

package org.example.redisson.JavaThread;

/**
 * @Description:TODO
 * @Author:Administrator
 * @Create 2024/1/12
 */

/**
 * 创建线程方式2:实现runable 接口重写run
 * 执行线程需要啊丢入new Thread(TestThread3)
 * 官方推荐 实现runable接口的方式
 */
public class TestThread4 implements Runnable {

    // 模拟票数
    private int ticketNums = 100;
    @Override
    public void run() {
        while (true){
            // 票剩余0时退出
            if (ticketNums <= 0){
                break;
            }
            // 模拟延时
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            // 对票数加锁
            synchronized ((Object)ticketNums){
                // 再次判断
                if (ticketNums <= 0){
                    break;
                }
                System.out.println(Thread.currentThread().getName()+"拿到了第"+ticketNums--+"张票");
            }
        }
    }

    public static void main(String[] args) {
        TestThread4 ticket = new TestThread4();

        new Thread(ticket,"陈X华").start();
        new Thread(ticket,"席X辉").start();
        new Thread(ticket,"李X杰").start();
    }
}

callable:

线程状态:

线程同步

线程通信

高级主题

JDK15 Lock