多线程基础

本文详细介绍了Java中的多线程概念,包括进程与线程的区别、线程的创建方式(继承Thread类、实现Runnable接口、Callable接口)、线程状态、线程同步与锁机制、死锁、线程池等内容,并通过实例分析了并发编程中可能遇到的问题和解决方案。
摘要由CSDN通过智能技术生成

进程Process与线程Thread

一个进程可以有多个线程,如视频中同时有声音,图像。
一个cpu情况下,在同一时间还是执行一件事,只是切换的快。
默认主线程,gc线程。

线程创建

死亡后的线程不能再start。

继承Thread类

public class MyThread extends Thread {
   
    @Override
    public void run() {
   
        for (int i = 0; i < 20; i++) {
   
            System.out.println("我在看代码---"+i);
        }
    }

    public static void main(String[] args) {
   
        MyThread myThread = new MyThread();
        //假多线程
        //myThread.run();
        //真多线程
        myThread.start();
        for (int i = 0; i < 20; i++) {
   
            System.out.println("我在学习多线程---"+i);
        }
    }
}

我在看代码---12
我在看代码---13
我在看代码---14
我在看代码---15
我在学习多线程---11
我在看代码---16
我在看代码---17
我在看代码---18
我在看代码---19
我在学习多线程---12
我在学习多线程---13
我在学习多线程---14

线程开启不一定立即执行,由cpu调度。

public class MyThread2 extends Thread {
   

    private String url;
    private String name;

    public MyThread2(String url,String name){
   
        this.url = url;
        this.name = name;
    }

    @Override
    public void run() {
   
        WebDownloader webDownloader = new WebDownloader();
        webDownloader.downloader(url,name);
        System.out.println("下载完成"+name);
    }

    //下载器
    static class WebDownloader{
   
        public void downloader(String url,String name){
   
            try {
   
            //需导入Commons-io包
                FileUtils.copyURLToFile(new URL(url),new File(name));
            } catch (IOException e) {
   
                e.printStackTrace();
                System.out.println("Io异常,downloader方法出现问题。");
            }
        }
    }

    public static void main(String[] args) {
   
        MyThread2 t1 = new MyThread2("url","1.jpg");
        MyThread2 t2 = new MyThread2("url","2.jpg");
        MyThread2 t3 = new MyThread2("url","3.jpg");

        t1.start();
        t2.start();
        t3.start();
    }
}

实现Runnable接口(推荐)

java单继承,所以推荐实现接口。
而且可以多个Thread对象使用一个run。

public class MyRunnable implements Runnable {
   
    @Override
    public void run() {
   
        for (int i = 0; i < 20; i++) {
   
            System.out.println("我在看代码---"+i);
        }
    }

    public static void main(String[] args) {
   
       MyRunnable myRunnable = new MyRunnable();
       //创建线程对象,通过线程对象来开启我们定义的线程
       Thread thread = new Thread(myRunnable);
       thread.start();

       for (int i = 0; i < 20; i++) {
   
           System.out.println("我在学习多线程---"+i);
       }
    }
}


我在学习多线程---15
我在看代码---6
我在学习多线程---16
我在看代码---7
我在学习多线程---17
我在看代码---8
我在学习多线程---18
我在看代码---9

并发问题

public class MyRunnable2 implements Runnable {
   

    private int num = 10;

    @Override
    public void run() {
   
        while (num > 0) {
   
            try {
   
                Thread.sleep(200);
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "拿到了第" + num--);
        }
    }

    public static void main(String[] args) {
   
        MyRunnable2 runnable2 = new MyRunnable2();

        new Thread(runnable2,"小明").start();
        new Thread(runnable2,"花花").start();
        new Thread(runnable2,"刘某").start();
    }
}

花花拿到了第2
刘某拿到了第3
刘某拿到了第1
小明拿到了第0
花花拿到了第1

龟兔赛跑

public class Race implements Runnable {
   

    private static String winner;

    @Override
    public void run() {
   
        for (int i = 0; i < 101; i++) {
   
            String name = Thread.currentThread().getName();

            boolean flag = gameOver(i);
            if (flag){
   
                break;
            }
            if ("兔子".equals(name)&&i%9==1){
   
                try {
   
                    Thread.sleep(10);
                } catch (InterruptedException e) {
   
                    e.printStackTrace();
                }
            }
            System.out.println(name+"--跑了"+i+"步");
        }
    }

    private boolean gameOver(int step){
   
        if (winner!=null){
   
            return true;
        }else {
   
            if (step>=100){
   
                winner = Thread.currentThread(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值