Java Scanner在单独的线程中输入

时间:2015-06-03 17:14:30

标签: java multithreading java.util.scanner nio

我有一个多线程命令行应用程序。它是一个Web服务客户端,具有10个线程池,可以将这些请求(批处理式)发送到服务器。

但是它运行了几天,有时在管道的下方,队列开始备份。所以我想去客户端,按 - 或+并增加或减少Thread.sleep(waitingTime),以减轻服务器压力。

我尝试在一个单独的线程中运行一个扫描仪,但它似乎没有用。有没有人设法在Java中使用非阻塞I / O?我认为这是可能的,但我现在就放弃了。

编辑:根据请求添加测试代码

package test;

import java.io.*;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Created by djb on 2015/06/03.
 */
public class ThreadTest {
    public ThreadTest() {
    }

    static long rand = 10000;

    public static void main(String args[])
    {

        ExecutorService executor = Executors.newFixedThreadPool(5);

        File f = new File("C:\\code\\ThreadTest\\text.csv");
        try {

            Runnable keyPressThread = new ThreadTest.KeyPressThread();
            Thread t = new Thread(keyPressThread);
            t.start();

            BufferedReader br = new BufferedReader(new FileReader(f));

            String line;

            while ((line = br.readLine()) != null)
            {

                try {
                    final String copy = line;

                    executor.execute(new Runnable() {
                        @Override
                        public void run() {
                            try {

                                System.out.println(rand);
                                Thread.sleep(rand);
                                System.out.println(copy);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    });


                } catch (Exception e)
                {
                    e.printStackTrace();
                }

            }

        } catch (Exception e)
        {
            e.printStackTrace();
        }




    }


    public static class KeyPressThread implements Runnable {

        Scanner inputReader = new Scanner(System.in);

        //Method that gets called when the object is instantiated
        public KeyPressThread() {
        }

        public void run() {
            String input = inputReader.next();
            if (input.equals("["))
            {
                rand+=100;
                System.out.println("Pressed [");
            }
            if (input.equals("]"))
            {
                rand-=100;
                System.out.println("Pressed ]");
            }
        }

    }



}

1 个答案:

答案 0 :(得分:1)

您的KeyPressThread只测试一次:

这将使它不断观看。

public void run() 
{
    while(true) 
    {
        if (inputReader.hasNext())
        {
            String input = inputReader.next();
            if (input.equals("["))
            {
                rand+=100;
                System.out.println("Pressed [");
            }
            if (input.equals("]"))
            {
               rand-=100;
               System.out.println("Pressed ]");
            }
            if (input.equalsIgnoreCase("Q"))
            {
                break; // stop KeyPressThread
            }
        }
    }
}
默认情况下,

System.in是行缓冲的。这意味着在按 ENTER 之前,实际上没有任何输入传递给程序。