当前位置: 首页 > article >正文

java面试题:10个线程如何按顺序分别输出1-100

面试题:10个线程如何按顺序分别输出1-100

难度:简单

考察:多线程,锁,并发处理

方式一:

MyNumber.java

public class MyNumber {
    public  Integer n = 1;
    public  Boolean f = false;  //标记是否已经100了,控制100的打印次数为一次
}

Task*.java

public class Task1 implements Runnable {
    private final MyNumber myNumber;
    public Task1(MyNumber myNumber) {
        this.myNumber = myNumber;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (myNumber) {
                if (myNumber.n == 100) {
                    if(!myNumber.f)System.out.println("task1->" + myNumber.n);
                    myNumber.f = true;
                    break;
                }
                System.out.println("task1->" + myNumber.n);
                myNumber.n++;
            }
        }
    }
}

Main.java

public class Main {
    static final int n = 1;
    public static void main(String[] args) {
        MyNumber myNumber = new MyNumber();
        Task1 task1 = new Task1(myNumber);
        Task2 task2 = new Task2(myNumber);
        Task3 task3 = new Task3(myNumber);
//        Task4 task4 = new Task4(n);
//        Task5 task5 = new Task5(n);
//        Task6 task6 = new Task6(n);
//        Task7 task7 = new Task7(n);
//        Task8 task8 = new Task8(n);

        new Thread(task1).start();
        new Thread(task2).start();
        new Thread(task3).start();
//        new Thread(task4).start();
//        new Thread(task5).start();
//        new Thread(task6).start();
//        new Thread(task7).start();
//        new Thread(task8).start();
    }
}

方式二:

线程池的写法

package com.javaclimb.test;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Main {
    static final int n = 1;

    public static void main(String[] args) {
        MyNumber myNumber = new MyNumber();
        Task1 task1 = new Task1(myNumber);
        //创建线程池
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, 10, 1,
                TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>(), new MyThreadFactory("task"));
        //10个任务提交给线程池
        for (int i = 1; i <= 10; i++) {
            threadPoolExecutor.execute(task1);
        }
        //关闭线程池
        threadPoolExecutor.close();
    }
}

//线程工厂
class MyThreadFactory implements ThreadFactory {
    private int count = 1;
    private String prefix;

    public MyThreadFactory(String prefix) {
        this.prefix = prefix;
    }

    @Override
    public Thread newThread(Runnable r) {
        Thread thread = new Thread(r);
        thread.setName(prefix + "-" + count++);
        thread.setPriority(Thread.NORM_PRIORITY);
        return thread;
    }
}

class MyNumber {
    public  Integer n = 1;
    public  Boolean f = false;
}

class Task implements Runnable {
    private final MyNumber myNumber;
    public Task(MyNumber myNumber) {
        this.myNumber = myNumber;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (myNumber) {
                if (myNumber.n == 100) {
                    if(!myNumber.f)System.out.println(Thread.currentThread().getName()+"->" + myNumber.n);
                    myNumber.f = true;
                    break;
                }
                System.out.println(Thread.currentThread().getName()+"->" + myNumber.n);
                myNumber.n++;
            }
        }
    }
}


http://www.kler.cn/a/525051.html

相关文章:

  • Airflow:掌握Airflow调度器基本原理
  • LangChain的开发流程
  • HTB:Active[RE-WriteUP]
  • Go语言中的Select
  • 芯片AI深度实战:进阶篇之vim内verilog实时自定义检视
  • 03链表+栈+队列(D2_栈)
  • Windows 11 应用开发实战指南
  • 【Elasticsearch 】悬挂索引(Dangling Indices)
  • 指针的介绍3后
  • Kafka 日志存储 — 磁盘存储
  • LeetCode:40. 组合总和 II(回溯 + 剪枝 Java)
  • Python3 【高阶函数】水平考试:30道精选试题和答案
  • SOME/IP--协议英文原文讲解4
  • 人工智能如何驱动SEO关键词优化策略的转型与效果提升
  • Unity阿里云OpenAPI 获取 Token的C#【记录】
  • Windows程序设计4:API函数URLDownloadToFile和ShellExecuteEx
  • Python3 【函数】:见证算法的优雅与力量
  • 论文阅读(十三):复杂表型关联的贝叶斯、基于系统的多层次分析:从解释到决策
  • 26.useScript
  • 如何将DeepSeek部署到本地电脑