首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用四个线程打印1到10

如何使用四个线程打印1到10
EN

Stack Overflow用户
提问于 2019-09-12 23:46:28
回答 2查看 73关注 0票数 0

如何使用4线程打印1到10,当打印10号线程时,通知所有其他线程终止。我想要这样的输出

代码语言:javascript
复制
t1 -1
 t2 -2
 t3 -3
 t4 -4
 t1 -5
 t2 -6
 t3 -7
 t4 -8 
 t1-9       
 t2 -10
 all thread stop

我试过了,但我知道这不是正确的方法,有人能告诉我正确的方法吗?我在互联网上找不到正确的答案,如果有人告诉我正确的方法,那将是一个很大的帮助

代码语言:javascript
复制
public class NumberGame {
    public static void main(String[] args) {

        PrintSequenceRunnable.startFrom("T1");

        new Thread(new PrintSequenceRunnable("T1", "T2")).start();
        new Thread(new PrintSequenceRunnable("T2", "T3")).start();
        new Thread(new PrintSequenceRunnable("T3", "T1")).start();
    }
}

class PrintSequenceRunnable implements Runnable {

    private final String name;
    private final String next;

    private static String moveTo;

    private static int value = 1;

    PrintSequenceRunnable(String name, String next) {
        this.name = name;
        this.next = next;
    }

    static void startFrom(String start) {
        moveTo = start;
    }



    @Override
    public void run() {
        do {
            synchronized (moveTo) {
                if (name.equals(moveTo)) {
                    System.out.println(name + "-" + (value++));
                    moveTo = next;
                } else {
                    uselessCounter++;
                }
            }
        } while (value < 10);

    }

}
EN

回答 2

Stack Overflow用户

发布于 2019-09-13 00:22:55

首先,如果你使用并发搜索线程安全的变量,对象和其他。永远不要使用像这样的private static int value = 1;,而要使用原子变量,例如private static AtomicInteger value = new AtomicInteger(0);。在你完成你的工作之前,你会一直做你的工作。如果任务已经完成,则中断线程。我有一段代码

类PrintSequenceRunnable实现了Runnable {

代码语言:javascript
复制
private final String name;
private final String next;

private static String moveTo;

private static AtomicInteger value = new AtomicInteger(0);

PrintSequenceRunnable(String name, String next) {
    this.name = name;
    this.next = next;
}

static void startFrom(String start) {
    moveTo = start;
}



@Override
public void run() {
    do {
            if (name.equals(moveTo) && value.get() < 10) {
                System.out.println(name + "-" + (value.incrementAndGet()));
                moveTo = next;
            }
    } while (value.get() < 10);
}

}

代码语言:javascript
复制
public static void main (String[] args) {
    PrintSequenceRunnable.startFrom("T1");

    new Thread(new PrintSequenceRunnable("T1", "T2")).start();
    new Thread(new PrintSequenceRunnable("T2" , "T3")).start();
    new Thread(new PrintSequenceRunnable("T3", "T4")).start();
    new Thread(new PrintSequenceRunnable("T4", "T1")).start();
}

输出:

代码语言:javascript
复制
T1-1
T2-2
T3-3
T4-4
T1-5
T2-6
T3-7
T4-8
T1-9
T2-10
票数 1
EN

Stack Overflow用户

发布于 2019-09-13 00:52:09

要让线程在单个工作“队列”中工作,请使用LinkedBlockingQueue。在这里,我下载了几个线程,然后从视频中创建了一个90秒的预览,然后我将其上传到亚马逊S3。另外,我使用的是BlockingLinkedQueue,也许你应该使用PriorityQueue,它会自动在队列中为你的物品排序。

每个线程从队列中拉出一个项目,没有冲突、锁定等。

代码语言:javascript
复制
        BlockingQueue<String> filesToDownload = new LinkedBlockingDeque<String>(1024);
        BlockingQueue<String> filesToPreview = new LinkedBlockingDeque<String>(1024);
        BlockingQueue<String> filesToUpload = new LinkedBlockingDeque<String>(1024);

        String currentYear = String.valueOf(Calendar.getInstance().get(Calendar.YEAR));

        // DB connection.
        DB db = new DB();
        PreparedStatement st = null;
        Connection conn = null;
        conn = db.getConnection();

        // get ids from ats_store.products.
        try {

            st = conn.prepareStatement(sql);
            st.setString(1, currentYear);
            ResultSet rs = st.executeQuery();
            // add each id to IDS.
            while (rs.next()) {
                filesToDownload.add(rs.getString("product_id"));
                filesToPreview.add(rs.getString("product_id"));
                filesToUpload.add(rs.getString("product_id"));
            }
            conn.close();

        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        int recordSize = filesToDownload.size();



        /**
         * Here we can find out how many cores we have.
         * Then make the number of threads NUMBER_OF_THREADS = the number of cores.
         */
        NUMBER_OF_THREADS = Runtime.getRuntime().availableProcessors();
        System.out.println("Thread Count: "+NUMBER_OF_THREADS);


        /**
         * 
         * CountDownLatch.we use this to block main until the working threads
         * are done working.
         */

        CountDownLatch startSignal = new CountDownLatch(1);
        CountDownLatch doneSignal = new CountDownLatch(NUMBER_OF_THREADS);

        // start up the Status Object class. For Reporting.
        Thread statusThread = new Thread(new Status(filesToDownload, currentYear, recordSize, "DOWNLOADING..."));
        statusThread.start();

        /**
         * prep downloader threads
         */
        Thread[] workers = new Thread[NUMBER_OF_THREADS];
        for (int x = 0; x < NUMBER_OF_THREADS; x++) {
            workers[x] = new Thread(new S3ObjectDownloader(filesToDownload, currentYear, startSignal, doneSignal));
            workers[x].start();
        }

        // start threads.
        startSignal.countDown();

        // block Main, wait for theads to complete.
        try {
            doneSignal.await();
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57910339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档