首页 > 其他分享 >多线程

多线程

时间:2024-08-05 18:16:27浏览次数:6  
标签:Thread void System println new 多线程 public

多线程

image-20240731104723773

Thread

package lesson01;

//创建线程的方式一:继承Thread类,重写run()方法,调用start开启线程
//线程开启不一定立即执行,有CPU调度执行
public class TestThread extends Thread{
    @Override
    public void run() {
        super.run();//run方法线程体
        for (int i = 0; i < 200; i++) {
            System.out.println("我在学习"+i);
        }
    }

    public static void main(String[] args) {
            //main线程,主线程
        //创建一个线程对象
        TestThread testThread = new TestThread();
        //调用start方法开启线程
        testThread.start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("我在学习多线程"+i);
        }
    }
}

Runnable

package lesson01;

//实现Runnable接口,重写run方法,执行线程需要丢入runnable接口实现类,调用start方法
public class TestThread3 implements Runnable {
    @Override
    public void run() {
        //run方法线程体
        for (int i = 0; i < 200; i++) {
            System.out.println("我在学习"+i);
        }
    }

    public static void main(String[] args) {
        //main线程,主线程
        //创建runnable接口的实现类对象
        TestThread3 testThread3 = new TestThread3();
        //创建线程对象,通过线程对象来开启线程
//        Thread thread = new Thread(testThread3);
//        thread.start();
        new Thread(testThread3).start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("我在学习多线程"+i);
        }
    }
}

初识 并发问题

package lesson01;

//多个线程同时操作同一个对象
//买火车票的
//发现问题:多个线程操作一个资源的情况下,线程不安全,数据紊乱
public class TestThread4 implements Runnable{
    private int ticketnums=10;
    @Override
    public void run() {
        while (true){
            if(ticketnums<=0){
                break;
            }
            //模拟延时
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"-->拿到了第"+ticketnums--+"票");
        }
    }

    public static void main(String[] args) {
        TestThread4 ticket = new TestThread4();
        new Thread(ticket,"小明").start();
        new Thread(ticket,"老师").start();
        new Thread(ticket,"黄牛党").start();
    }
}

龟兔赛跑

package lesson01;

public class Race implements Runnable{
    //胜利者
    private static String winner;
    @Override
    public void run() {
        for (int i = 0; i <= 100; i++) {
            //5模拟兔子睡觉
            if(Thread.currentThread().getName().equals("兔子")&& i%10==0){
                try {
                    Thread.sleep(2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //1判断比赛是否结束
            boolean flag = gameOver(i);
            //2如果比赛结束了,就停止程序
            if(flag){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"步");
        }
    }
    //3判断是否完成比赛
    private boolean gameOver(int steps){
        //4判断是否有胜利者
        if(winner!=null){//已经存在胜利者
            return true;
        }{
            if(steps>=100){
                winner = Thread.currentThread().getName();
                System.out.println("winner is"+winner);
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        Race race = new Race();
        new Thread(race,"兔子").start();
        new Thread(race,"乌龟").start();
    }
}

静态代理

package lesson2;

//静态代理模式
//真实对象和代理对象都要实现同一个接口
//代理对象要代理真实角色
public class StacticProxy {
    public static void main(String[] args) {
        You you = new You();
        new Thread(()-> System.out.println("love you")).start();
        new WeddingCompany(new You()).HappyMarry();
    }
}

interface Marry{
    void HappyMarry();
}

//真实角色
class You implements Marry{
    @Override
    public void HappyMarry() {
        System.out.println("结婚了");
    }
}

//代理角色,帮助你结婚
class WeddingCompany implements Marry{
    //代理真实角色
    private Marry target;

    public WeddingCompany(Marry target) {
        this.target = target;
    }

    @Override
    public void HappyMarry() {
        before();
        this.target.HappyMarry();
        after();
    }

    private void after() {
        System.out.println("收尾款");
    }

    private void before() {
        System.out.println("结婚之前布置现场");
    }
}

推到lambad表达式

package lesson2;

//推到lambda表达式
public class TestLambda1 {
    //3.静态内部类
    static class Like2 implements ILike{
        @Override
        public void lambad() {
            System.out.println("I like lambda2");
        }
    }
    public static void main(String[] args) {
        ILike like = new Like();
        like.lambad();

        like = new Like2();
        like.lambad();

        //4.局部内部类
        class Like3 implements ILike{
            @Override
            public void lambad() {
                System.out.println("I like lambda3");
            }
        }
        like = new Like3();
        like.lambad();

        //匿名内部类,没有类的名称,必须借助接口或父类
        like =new ILike() {
            @Override
            public void lambad() {
                System.out.println("I like lambda4");
            }
        };
        like.lambad();

        //6.用lambda简化
        like = () -> {
            System.out.println("I like lambda5");
        };
        like.lambad();

    }
}

//1定义一个函数式接口
interface ILike{
    void lambad();
}

//2.实现类
class Like implements ILike{
    @Override
    public void lambad() {
        System.out.println("I like lambda");
    }
}

简化 lambda 表达式

package lesson2;

public class TestLambda2 {

    public static void main(String[] args) {
        ILove love =null;
        /*ILove love = (int a)-> {
                System.out.println("Love You ->"+a);
            };
        //简化1 去掉参数类型
        love = (a)-> {
            System.out.println("Love You ->"+a);
        };*/
        //简化2 去掉括号
        love = (a,b)-> {
            System.out.println("Love You ->"+a);
            System.out.println(234);
        };
        //简化3 去掉花括号
        love =(a,b)-> System.out.println("Love You ->"+a+b);
        love.love(521,502);
    }
    //lambda表达式只能有一行代码的情况下才能简化成一行,如果有多行,就用代码块包裹
    //前提是接口必须是函数式接口
    //多个参数也可以去掉参数类型,要去掉就都去掉,必须加括号;
}

interface ILove{
    void love(int a,int b);
}

Callable方法

package lesson2;

import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.concurrent.*;

public class TestCallable implements Callable<Boolean> {

    private String url;//网络图片地址
    private String name;//保存的文件名

    public TestCallable(String url,String name){
        this.url=url;
        this.name=name;
    }
    //下载图片线程的执行体
    @Override
    public Boolean call() {
        WebDownloader webDownloader= new WebDownloader();
        webDownloader.downloader(url,name);
        System.out.println("下载了文件名:"+name);
        return true;
    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        TestCallable t1 = new TestCallable("/i/l/?n=24&i=blog/3477492/202407/3477492-20240731143701587-893341756.png","1.png");
        TestCallable t2 = new TestCallable("/i/l/?n=24&i=blog/3477492/202407/3477492-20240731143701581-272578577.png","2.png");
        TestCallable t3 = new TestCallable("/i/l/?n=24&i=blog/3477492/202407/3477492-20240731143701879-1214671590.png","3.png");
        //创建执行服务
        ExecutorService ser = Executors.newFixedThreadPool(3);
        //提交服务
        Future<Boolean> r1 = ser.submit(t1);
        Future<Boolean> r2 = ser.submit(t2);
        Future<Boolean> r3 = ser.submit(t3);
        //获取结果
        boolean rs1 = r1.get();
        boolean rs2 = r2.get();
        boolean rs3 = r3.get();
        System.out.println(rs1);
        System.out.println(rs2);
        System.out.println(rs3);
        //关闭服务
        ser.shutdown();
    }
}
//下载器
class WebDownloader{
    //下载方法
    public void downloader(String url,String name){
        try {
            FileUtils.copyURLToFile(new URL(url),new File(name));
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("IO异常,downloader方法出现问题");
        }
    }
}

线程停止

package lesson2;

//测试stop
//1.建议线程正常停止,-->利用次数,不建议死循环
//2.建议标志位,-->设置一个标志位
//3.不要使用stop或者destory等过时的或者JDK不建议使用的方法
public class TestStop implements Runnable{
    //1.设置一个标志位
   private boolean flag = true;
    @Override
    public void run() {
        int i =0;
        while (flag){
            System.out.println("run...Thread"+i++);
        }
    }

    //2.设置一个公开的方法停止线程,转换标志位
    public void stop(){
        this.flag=false;
    }
    public static void main(String[] args) {
        TestStop testStop = new TestStop();
        new Thread(testStop).start();
        for (int i = 0; i < 1000; i++) {
            System.out.println("mian"+i);
            if(i==900){
                //调用stop方法切换标志位,让线程停止
                testStop.stop();
                System.out.println("线程停止了");
            }
        }
    }
}

线程休眠 sleep

package lesson2;

import java.text.SimpleDateFormat;
import java.util.Date;

//模拟倒计时
public class TestSleep2 {
    public static void main(String[] args) {
        //打印当前系统时间
        Date startTime = new Date(System.currentTimeMillis());//获取系统当前时间
        while (true){
            try {
                Thread.sleep(1000);
                System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
                startTime = new Date(System.currentTimeMillis());//更新时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    //模拟倒计时
    public static void tenDown() throws InterruptedException {
        int num =10;
        while (true){
            Thread.sleep(1000);
            System.out.println(num--);
            if(num<=0){
                break;
            }
        }
    }
}

join 插队

package lesson2;

//测试join方法,插队
public class TestJoin implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("线程vip"+i);
        }
    }

    public static void main(String[] args) throws InterruptedException {
        //启动线程
        TestJoin testJoin = new TestJoin();
        Thread thread = new Thread(testJoin);
        thread.start();
        //主线程
        for (int i = 0; i < 1000; i++) {
            if(i==200){
                thread.join();
               
            }
            System.out.println("mian"+i);
        }
    }
}

观察线程的五大状态

新生->就绪->运行->阻塞->死亡

package lesson2;

//观察线程的启动状态
public class TestState {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            for (int i = 0; i < 5; i++) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("//////");
        });
        //观察状态
        Thread.State state = thread.getState();
        System.out.println(state);//NEW新生状态

        //观察启动后
        thread.start();//启动线程
        state=thread.getState();
        System.out.println(state);//Run

        while (state!= Thread.State.TERMINATED){//只要线程不终止,就一直输出状态
            Thread.sleep(100);
            state=thread.getState();//更新状态
            System.out.println(state);//输出状态
        }
    }
}

测试线程的优先级

package lesson03;

//测试线程的优先级
public class TestPriority {
    public static void main(String[] args) {
        //主线程的默认优先级
        System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());
        MyPriority myPriority = new MyPriority();
        Thread t1 = new Thread(myPriority);
        Thread t2 = new Thread(myPriority);
        Thread t3 = new Thread(myPriority);
        Thread t4 = new Thread(myPriority);
        Thread t5 = new Thread(myPriority);

        //先设置优先级,再启动
        t1.start();
        t2.setPriority(2);
        t2.start();

        t3.setPriority(6);
        t3.start();

        t4.setPriority(Thread.MAX_PRIORITY);
        t4.start();

        t5.start();
    }
}

class MyPriority implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"-->"+Thread.currentThread().getPriority());
    }
}

守护线程

package lesson03;

//测试守护线程
public class TestDemon {
    public static void main(String[] args) {
        God god = new God();
        You you = new You();
        Thread thread = new Thread(god);
        thread.setDaemon(true);//默认false表示用户线程,正常的线程都是用户线程
        thread.start();//守护线程启动
        new Thread(you).start();//用户线程启动


    }
}

//上帝
class God implements Runnable{
    @Override
    public void run() {
        while (true) {
            System.out.println("上帝保佑着你");
        }
    }
}

//你
class You implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 36500; i++) {
            System.out.println("你一生都开心的活着");
        }
        System.out.println("goodbye world!");
    }
}

多线程的不安全案例

package lesson04;


//不安全的取钱
public class UnSafeBank {
    public static void main(String[] args) {
        //账户
        Account account = new Account(100,"金额");
        Drawing you = new Drawing(account,50,"你");
        Drawing girlFrend = new Drawing(account,100,"girlFrend");

        you.start();
        girlFrend.start();
    }
}

//账户
class Account{
    int money;//余额
    String name;//卡名
    public Account(int money,String name){
        this.money= money;
        this.name=name;
    }
}

//模拟取款
class Drawing extends Thread{
    Account account;//账户
    int drawingMoney;//取了多少钱
    int nowMoney;//现在手里还有多少钱
    public Drawing(Account account,int drawingMoney,String name){
        super(name);
        this.account=account;
        this.drawingMoney = drawingMoney;
    }

    //取钱
    @Override
    public void run() {
        //判断有没有钱
        if(account.money-drawingMoney<0){
            System.out.println(Thread.currentThread().getName()+"钱不够,取不了");
            return;
        }
        //sleep 可以放大问题的发生性
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        account.money=account.money-drawingMoney;//卡内余额 = 余额-取得钱
        nowMoney=nowMoney+drawingMoney;//手里的钱
        System.out.println(account.money+"余额为:"+account.money);
        System.out.println(this.getName()+"手里的钱"+nowMoney);
    }
}
package lesson04;

import java.util.ArrayList;
import java.util.List;

//线程不安全的集合
public class UnsafeList {
    public static void main(String[] args) throws InterruptedException {
        List<String> list =new ArrayList<String>();
        for (int i = 0; i < 1000; i++) {
            new Thread(()->{
                list.add(Thread.currentThread().getName());
            }).start();
        }
        Thread.sleep(1000);
        System.out.println(list.size());
    }
}

synchronized方法和synchronized方法块

package lesson01;

//多个线程同时操作同一个对象
//买火车票的
//发现问题:多个线程操作一个资源的情况下,线程不安全,数据紊乱
public class TestThread4 implements Runnable{
    private int ticketnums=10;
    @Override
    //synchronized针对的是增删改查的对象
    public synchronized void run() {
        while (true){
            if(ticketnums<=0){
                break;
            }
            //模拟延时
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+"-->拿到了第"+ticketnums--+"票");
        }
    }

    public  static void main(String[] args) {
        TestThread4 ticket = new TestThread4();
        new Thread(ticket,"小明").start();
        new Thread(ticket,"老师").start();
        new Thread(ticket,"黄牛党").start();
    }
}
package lesson04;


//不安全的取钱
public class UnSafeBank {
    public static void main(String[] args) {
        //账户
        Account account = new Account(100,"金额");
        Drawing you = new Drawing(account,50,"你");
        Drawing girlFrend = new Drawing(account,100,"girlFrend");

        you.start();
        girlFrend.start();
    }
}

//账户
class Account{
    int money;//余额
    String name;//卡名
    public Account(int money,String name){
        this.money= money;
        this.name=name;
    }
}

//模拟取款
class Drawing extends Thread{
    Account account;//账户
    int drawingMoney;//取了多少钱
    int nowMoney;//现在手里还有多少钱
    public Drawing(Account account,int drawingMoney,String name){
        super(name);
        this.account=account;
        this.drawingMoney = drawingMoney;
    }

    //取钱
    @Override
    public void run() {
        //synchronized默认锁的是this,锁的对象是变化的量
        synchronized (account){
            //判断有没有钱
            if(account.money-drawingMoney<0){
                System.out.println(Thread.currentThread().getName()+"钱不够,取不了");
                return;
            }
            //sleep 可以放大问题的发生性
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            account.money=account.money-drawingMoney;//卡内余额 = 余额-取得钱
            nowMoney=nowMoney+drawingMoney;//手里的钱
            System.out.println(account.money+"余额为:"+account.money);
            System.out.println(this.getName()+"手里的钱"+nowMoney);

        }

    }
}

测试JUC安全类型的集合

package lesson04;

import java.util.concurrent.CopyOnWriteArrayList;

//测试JUC安全类型的集合
public class JUCDemo01 {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>();
        for (int i = 0; i < 1000; i++) {
            new Thread(()->{
                list.add(Thread.currentThread().getName());
            }).start();
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(list.size());
    }
}

解决死锁的方法

package lesson04;

//死锁:多个线程相互有对方需要的资源,然后形成僵持
public class DeadLock {
    public static void main(String[] args) {
        Makeup g1 = new Makeup(0,"灰姑凉");
        Makeup g2 = new Makeup(1,"白雪公主");
        g1.start();
        g2.start();
    }

}

//口红
class Lipstick{

}

//镜子
class  Mirror{

}

//化妆
class Makeup extends Thread{
    //需要的资源只有一份,用static保证只有一份
    static Lipstick lipstick = new Lipstick();
    static Mirror mirror = new Mirror();
    int choice;//选择
    String girlName;//使用化妆品的人
    Makeup(int choice,String girlName){
        this.choice=choice;
        this.girlName=girlName;

    }
    @Override
    public void run() {
        try {
            makeup();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //化妆
    }
    //化妆,互相持有对方的锁,就是需要拿到对方的资源
    private void makeup() throws InterruptedException {
        if(choice==0){
            synchronized (lipstick){//获得口红的锁
                System.out.println(this.girlName+"获得口红的锁");
                Thread.sleep(1000);
            }
            synchronized (mirror){//一秒后获得镜子的锁
                System.out.println(this.girlName+"获得镜子的锁");
            }
        }else {
            synchronized (mirror){//获得口红的锁
                System.out.println(this.girlName+"获得镜子的锁");
                Thread.sleep(1000);
            }
            synchronized (lipstick){//一秒后获得镜子的锁
                System.out.println(this.girlName+"获得口红的锁");
            }
        }
    }
}

加锁和解锁

package lesson04;

import java.util.concurrent.locks.ReentrantLock;

//测试Lock
public class TestLock {
    public static void main(String[] args) {
        TestLock2 testLock2 = new TestLock2();
        new Thread(testLock2).start();
        new Thread(testLock2).start();
        new Thread(testLock2).start();
    }
}

class TestLock2 implements Runnable{
    int ticketNums=10;
    //定义锁
    private final ReentrantLock lock = new ReentrantLock();
    @Override
    public void run() {
        while (true){

            try{
                lock.lock();//加锁
                if(ticketNums>0){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(ticketNums--);
                }else {
                    break;
                }
            }finally {
                //解锁
                lock.unlock();
            }

        }
    }
}

管程法

package lesson04;

//测试:生产者消费者模型-》利用缓冲区解决:管程法
//生产者 ,消费者,产品,缓冲区
public class TestPC {
    public static void main(String[] args) {
        SynContainer container = new SynContainer();
        new Productor(container).start();
        new Consumer(container).start();
    }
}

//产生者
class Productor extends Thread{
        SynContainer container;
        public Productor(SynContainer container){
            this.container=container;
        }
        //生产

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            container.push(new Chicken(i));
            System.out.println("生产了"+i+"只鸡");
        }
    }
}

//消费者
class Consumer extends Thread{
    SynContainer container;
    public Consumer(SynContainer container){
        this.container=container;
    }

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("消费了-->"+container.pop().id+"只鸡");
        }
    }
}

//产品
class Chicken{
    int id;//产品编号
    public Chicken(int id) {
        this.id = id;
    }
}

//缓冲区
class SynContainer{
    //需要一个容器大小
    Chicken[] chickens = new Chicken[10];
    //容器计数器
    int count =0;
    //生产者放入产品
    public synchronized void push(Chicken chicken){
        //如果容器满了,就需要等待消费者消费
        if(count==chickens.length){
            //通知消费者消费,生产者等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //如果没有满,就需要放入产品
        chickens[count]=chicken;
        count++;
        //可以通知消费者消费
        this.notifyAll();
    }
    //消费者消费产品
    public synchronized  Chicken pop(){
        //判断能否消费
        if(count==0){
            //等待生产者生产,消费者等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //如果可以消费
        count--;
        Chicken chicken = chickens[count];

        //吃完了,通知生产者生产
        this.notifyAll();
        return chicken;
    }
}

信号灯法,利用标志位解决

package lesson04;

//信号灯法,标志位解决
public class TestPC2 {
    public static void main(String[] args) {
        TV tv = new TV();
        new Player(tv).start();
        new Watcher(tv).start();
    }
}

//生产者-演员
class Player extends Thread{
    TV tv;
    public Player(TV tv){
        this.tv=tv;
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            if(i%2==0){
                this.tv.play("快乐大本营播放中");
            }else {
                this.tv.play("抖音");
            }
        }
    }
}
//消费者-观众
class Watcher extends Thread{
    TV tv;
    public Watcher(TV tv){
        this.tv=tv; 
    }

    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            tv.watch();
        }
    }
}
//产品-节目
class TV{
    //演员表演,观众等待 T
    //观众观看,演员等待 F
    String voice;//表演的节目
    boolean flag = true;
    //表演
    public synchronized void play(String voice){
        if (!flag){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("演员表演了:"+voice);
        //通知观众观看
        this.notifyAll();
        this.voice = voice;
        this.flag= !this.flag;
    }
    //观看
    public synchronized void watch(){
        if(flag){
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("观众观看了"+voice);
        //通知演员表演
        this.notifyAll();
        this.flag= !this.flag;
    }
}

线程池

image-20240805175540001

package lesson04;

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

//测试线程池
public class TestPool {
    public static void main(String[] args) {
        //1.创建服务,创建线程池
        //2.newFixedThreadPool参数为池子大小
        ExecutorService service = Executors.newFixedThreadPool(10);
        service.execute(new MyThread());
        service.execute(new MyThread());
        service.execute(new MyThread());
        service.execute(new MyThread());
        //2.关闭连接
        service.shutdown();
    }
}

class MyThread implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}

标签:Thread,void,System,println,new,多线程,public
From: https://www.cnblogs.com/huangjiangfei/p/18343799

相关文章

  • 多线程-进阶2
     博主主页: 码农派大星.  数据结构专栏:Java数据结构 数据库专栏:MySQL数据库JavaEE专栏:JavaEE关注博主带你了解更多数据结构知识1.CAS1.1CAS全称:Compareandswap比较内存和cpu寄存器中的内容,如果发现相同,就进行交换(交换的是内存和另一个寄存器的内容)......
  • JavaEE 第1节 认识多线程
    本节目标(全是重点,都必须掌握)1、了解什么是线程、多线程、进程以及他们之间的关系2、了解多线程的优势以及各种特性3、用Java掌握多种创建线程的方法一、线程、多线程、进程1、概念1.基本概念这三个名词的概念可以用一个餐馆的厨房和厨师来进行超级形象的比喻。想象一下......
  • Java通过redis实线多线程多用户操作时添加锁
    背景由于项目中多出涉及同步数据,同步过程就是从设备上查询数据,将数据库中该设备数据删除,将新数据导入到数据库;多次同步数据或多用户操作,会导致数据库出现重复数据,例如,两个线程同时删除设备数据,同时导入数据,就会出现双倍数据;还有线程1正在导入数据,中途线程2将线程1导入数据之前删......
  • Java使用多线程池给List赋值导致List存在空的处理
    错误示例:publicList<String>test()throwsNuMaxCloudCommonException{ExecutorServiceexecutorService=Executors.newFixedThreadPool(3);List<String>list=newArrayList<>();for(inti=0;i<3;i++){......
  • 【QT】Qt 多线程
    多线程qt多线程1.Qt多线程概述2.QThread常用API3.使用线程4.线程安全(1)互斥锁(2)条件变量(3)信号量qt多线程1.Qt多线程概述在Qt中,多线程的处理⼀般是通过QThread类来实现。QThread代表⼀个在应用程序中可以独立控制的线程,也可以和进程中的其他线程共享......
  • 多线程编程
    目录思维导图:学习内容:1. 多线程基本概念2.多线程编程2.1 pthread_create:创建线程 2.2 pthread_self线程号的获取2.3 pthread_exit:线程退出函数课外作业:1、使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资......
  • x264 中多线程相关编码参数详细介绍
    多线程编码相关参数参数名称参数类型参数含义cpuuint32_tcpu型号i_threadsint并行编码线程数i_lookahead_threadsint在lookahead分析中使用多线程b_deterministicint当开启多线程时是否允许非确定性优化b_sliced_threadsint是否使用基于......
  • 使用snapshot_download配置代理多线程下载模型
    snapshot_downloadhuggingface官方提供了snapshot_download方法下载完整模型,参数众多、比较完善。支持断点续传、多线程、指定路径、配置代理、排除特定文件等功能。然而有两个缺点:1))该方法依赖于transformers库,而这个库是个开发用的库,对于自动化运维有点重;2)该方法调用......
  • Java多线程编程详解:从基础到高级
    Java多线程编程详解:从基础到高级大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Java的多线程编程允许程序同时执行多个任务,提高了应用的性能和响应能力。本文将从基础到高级,全面介绍Java中的多线程编程,包括线程的创建、线程池、同步机制及并发工具的使用......
  • java 多线程简单实现
    Java实现多线程的方式在java中实现多线程有四种方式,如下:1、继承Thread类2、实现Runnable接口3、使用FutureTask4、使用Executor框架2、继承Thread类Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Th......