同步方法()仅运行1个线程,直到多个

时间:2018-05-03 14:26:42

标签: java multithreading sockets

这是我试图为大学做的一个项目。

我正在使用套接字创建应用,将多个客户端连接到服务器。 当我获得新连接时,会调用ServerHandler的新实例,该实例会侦听端口以获取来自客户端的请求。

这是我的ServerHandler类

public class ServerHandler implements Runnable {

    private Socket clientSocket;
    private Server server;
    ArrayList<Thread> threads = new ArrayList<Thread>();
    ArrayList<News> news = new ArrayList<News>();
    ArrayList<News> filteredNews = new ArrayList<>();
    private int iterator = 0;
    private boolean available = true;
    private boolean finished = false;

    public ServerHandler(Socket clientSocket, Server server) {
        this.clientSocket = clientSocket;
        this.server = server;
        this.news = server.getListNews();
    }

    @Override
    public void run() {
        System.out.println("Hello!");
        while(true) {
            try {
                System.out.println("Waiting for input");
                BufferedReader br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                String str = br.readLine();
                System.out.println(str);
                new Thread(new Runnable() {

                    @Override
                    public void run() {
                        try {
                            manageMessages();
                        } catch (IOException e) {
                            e.printStackTrace();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }                       
                    }

                    private void manageMessages() throws IOException, InterruptedException {
                        System.out.println("Button Search.");
                        launchThreads(str);
                        for(Thread t : threads) {
                            t.join();
                        }
                        filteredNews.sort(null);
                        System.out.println("News have been filtered and sorted.");
                        System.out.println("Sending info to Client.");
                        sendtoClient();
                        System.out.println("Sent info to Client.");             
                    }
                }).start();

            } catch (IOException e) {
                System.out.println("Socket closed" + e);
                break;
            }
        }

    }

当我收到请求时,我会启动一个负责向客户返回内容的新线程。

我的问题来自launchThreads(String str)方法。 此方法旨在为线程数组创建和添加10个线程。 然后,每个线程将通过相同的ArrayList新闻来搜索客户发送的单词(String str)。

所有主题都应该共享作品,即通过共享String str中的每个新闻搜索ArrayList<News>

private void launchThreads(String str) {
    System.out.println("Lauching threads");
    filteredNews.clear();
    threads.clear();
    finished = false;
    available = true;
    iterator = 0;
    for(int i = 0; i < 10; i++) {
        threads.add(new Thread(new Runnable(){public void run(){try {
            queueThreads(str);
            filterNews(str);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }}}));
        threads.get(i).start();
    }
    System.out.println("Launched threads: " + threads.size());
}

private synchronized void queueThreads(String str) throws InterruptedException {
    while(!available && !finished) {
        System.out.println("Waiting.");
        wait();
    }
    System.out.println("Gone through.");
    available = false;  
}

private synchronized void filterNews(String str) throws InterruptedException {
    int contador = 0;
    if(iterator < news.size()) {
        String temp = news.get(iterator).getTitle() + " " + news.get(iterator).getBody();
        String[] tempArray = temp.replaceAll("[^a-zA-Z ]", "").split("\\s+");
        for(String word : tempArray) {
            if(word.equalsIgnoreCase(str)) {
                contador++;
            }
        }
        if(contador > 0) {
            News n = new News(news.get(iterator).getTitle(),news.get(iterator).getBody(), contador);
            n.setTitle(contador + " - " + n.getTitle());
            System.out.println(news.get(iterator).toString());
            filteredNews.add(n);
        }
        iterator++;
    }else {
        finished = true;
    }
    available = true;
    notifyAll();
    queueThreads(str);}

我得到的是,只有1个线程运行整个搜索,而其他线程只是等待,直到我将完成的标志更改为'true',这是在搜索结束时设置的。

我希望得到一些帮助,我可以如何启动多个线程来完成它们之间的数组共享工作。

提前致谢。

0 个答案:

没有答案