使用runnable类并使其成为自己的线程

问题描述 投票:0回答:1

嘿所有对Java的新手我确信这很简单但只是无法正确使用才能使它工作。

这个runnable类的原始java代码:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ChatServer {
    private static Set < String > names = new HashSet < > ();
    private static Set < PrintWriter > writers = new HashSet < > ();
    public static int thePort = 8877;

    private static boolean isPortInUse(String host, int port) throws SocketException {
        boolean result = false;

        try {
            (new Socket(host, port)).close();
            result = true;

        } catch (IOException e) {
            // Could not connect.
        }

        return result;
    }

    @SuppressWarnings("unused")
    public static void main(String[] args) throws Exception {
        System.out.println("The chat server is running...");
        ExecutorService pool = Executors.newFixedThreadPool(500);
        boolean hasPort = isPortInUse("localhost", thePort);

        try (ServerSocket listener = new ServerSocket(thePort)) {
            while (true) {
                pool.execute(new Handler(listener.accept()));
            }
        }
    }

    private static class Handler implements Runnable {
        private String name;
        private Socket socket;
        private Scanner in ;
        private PrintWriter out;

        public Handler(Socket socket) {
            this.socket = socket;
        }

        public void run() {
            try {
                in = new Scanner(socket.getInputStream());
                out = new PrintWriter(socket.getOutputStream(), true);

                while (true) {
                    out.println("SUBMITNAME");
                    name = in .nextLine();

                    if (name == null) {
                        return;
                    }

                    synchronized(names) {
                        if (!name.isEmpty() && !names.contains(name)) {
                            names.add(name);
                            break;
                        }
                    }
                }

                out.println("NAMEACCEPTED " + name);

                for (PrintWriter writer: writers) {
                    writer.println("MESSAGE " + name + " has joined");
                }

                writers.add(out);

                while (true) {
                    String input = in .nextLine();

                    if (input.toLowerCase().startsWith("/quit")) {
                        return;
                    }

                    for (PrintWriter writer: writers) {
                        writer.println("MESSAGE " + name + ": " + input);
                    }
                }
            } catch (Exception e) {
                System.out.println(e);
            } finally {
                if (out != null) {
                    writers.remove(out);
                }

                if (name != null) {
                    System.out.println(name + " has left");
                    names.remove(name);

                    for (PrintWriter writer: writers) {
                        writer.println("MESSAGE " + name + " has left");
                    }
                }
                try {
                    socket.close();
                } catch (IOException e) {}
            }
        }
    }
}

我创建的线程代码是这样的:

static Thread serverThread = new Thread(new Runnable() {
    private String name;
    private Socket socket;
    private Scanner in ;
    private PrintWriter out;

    @Override
    public void run() {
        try {
            Set < String > names = new HashSet < > ();
            Set < PrintWriter > writers = new HashSet < > ();
            int thePort = 8877;

            System.out.println("The chat server is running...");
            ExecutorService pool = Executors.newFixedThreadPool(500);
            boolean hasPort = isPortInUse("localhost", thePort);

            try (ServerSocket listener = new ServerSocket(thePort)) {
                while (true) {
                    pool.execute(new Handler(listener.accept()));
                }
            }
            try {
                in = new Scanner(socket.getInputStream());
                out = new PrintWriter(socket.getOutputStream(), true);

                while (true) {
                    out.println("SUBMITNAME");
                    name = in .nextLine();

                    if (name == null) {
                        return;
                    }

                    synchronized(names) {
                        if (!name.isEmpty() && !names.contains(name)) {
                            names.add(name);
                            break;
                        }
                    }
                }

                out.println("NAMEACCEPTED " + name);

                for (PrintWriter writer: writers) {
                    writer.println("MESSAGE " + name + " has joined");
                }

                writers.add(out);

                while (true) {
                    String input = in .nextLine();

                    if (input.toLowerCase().startsWith("/quit")) {
                        return;
                    }

                    for (PrintWriter writer: writers) {
                        writer.println("MESSAGE " + name + ": " + input);
                    }
                }
            } catch (Exception e) {
                System.out.println(e);
            } finally {
                if (out != null) {
                    writers.remove(out);
                }

                if (name != null) {
                    System.out.println(name + " has left");
                    names.remove(name);

                    for (PrintWriter writer: writers) {
                        writer.println("MESSAGE " + name + " has left");
                    }
                }

                try {
                    socket.close();
                } catch (IOException e) {}
            }
        } catch (Exception e) {
            System.out.println(e);
        }
    }

    public void Handler(Socket socket) {
        this.socket = socket;
    }

    private boolean isPortInUse(String host, int port) throws SocketException {
        boolean result = false;

        try {
            (new Socket(host, port)).close();
            result = true;
        } catch (IOException e) {
            // Could not connect.
        }

        return result;
    }    
});

我上述所有代码中只有2个错误是:

处理程序无法解析为某种类型

pool.execute(new Handler(listener.accept()));

缺少方法的返回类型

public Handler(Socket socket) {

那么我需要更改什么才能替换Handler以便它可以与我创建的线程代码一起使用?

更新#1

我的主要课程,我称之为服务器和客户端:

        @SuppressWarnings({ "resource", "unused" })
        private static void placeChatOnScreen() {
            textField = new JTextField();
            textField.setFont(new Font("Segoe UI", Font.PLAIN, 13));
            textField.setDragEnabled(true);
            textField.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0)));
            textField.setBounds(338, 838, 954, 22);
            frame.getContentPane().add(textField);

            messageArea = new JTextArea();
            messageArea.setEditable(false);
            messageArea.setFont(new Font("Segoe UI", Font.PLAIN, 13));
            messageArea.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 0)));
            messageArea.setDragEnabled(true);
            messageArea.setName("chatArea");
            messageArea.setWrapStyleWord(true);
            messageArea.setBounds(338, 648, 954, 181);
            frame.getContentPane().add(messageArea);

            textField.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    out.println(textField.getText());
                    textField.setText("");
                }
            });

             // start server
            final Thread serverThread = new Thread(new Handler());
            serverThread.start();
            // wait a bit
            Thread.sleep(1000);
            // start client
            clientThread.start();
        }

这是服务器类(正如你所说的那样):

public class ChatServer {
    private static Set<String> names = new HashSet<>();
    private static Set<PrintWriter> writers = new HashSet<>();
    public static int thePort = 8877;

    private static boolean isPortInUse(String host, int port) throws SocketException {
      boolean result = false;

      try {
        (new Socket(host, port)).close();
        result = true;

      }
      catch(IOException e) {
        // Could not connect.
      }

      return result;
    }

    @SuppressWarnings("unused")
    public static void main(String[] args) throws Exception {
        System.out.println("The chat server is running...");
        ExecutorService pool = Executors.newFixedThreadPool(500);
        boolean hasPort = isPortInUse("localhost", thePort);

        try (ServerSocket listener = new ServerSocket(thePort)) {
            while (true) {
                pool.execute(new Handler(listener.accept()));
            }
        }
    }

    public static class Handler implements Runnable {
        private String name;
        private Socket socket;
        private Scanner in;
        private PrintWriter out;

        public Handler(Socket socket) {
            this.socket = socket;
        }

        public void run() {
            try {
                in = new Scanner(socket.getInputStream());
                out = new PrintWriter(socket.getOutputStream(), true);

                while (true) {
                    out.println("SUBMITNAME");
                    name = in.nextLine();

                    if (name == null) {
                        return;
                    }

                    synchronized (names) {
                        if (!name.isEmpty() && !names.contains(name)) {
                            names.add(name);
                            break;
                        }
                    }
                }

                out.println("NAMEACCEPTED " + name);

                for (PrintWriter writer : writers) {
                    writer.println("MESSAGE " + name + " has joined");
                }

                writers.add(out);

                while (true) {
                    String input = in.nextLine();

                    if (input.toLowerCase().startsWith("/quit")) {
                        return;
                    }

                    for (PrintWriter writer : writers) {
                        writer.println("MESSAGE " + name + ": " + input);
                    }
                }
            } catch (Exception e) {
                System.out.println(e);
            } finally {
                if (out != null) {
                    writers.remove(out);
                }

                if (name != null) {
                    System.out.println(name + " has left");
                    names.remove(name);

                    for (PrintWriter writer : writers) {
                        writer.println("MESSAGE " + name + " has left");
                    }
                }
                try { socket.close(); } catch (IOException e) {}
            }
        }
    }
}

更新#2

enter image description here

enter image description here

java multithreading handler runnable
1个回答
0
投票

你声明了一个private类,它不能从其他类访问

private static class Handler implements Runnable { ... }

因此,如果它们共享相同的包,只需将其标记为public或package-private(无修饰符)

public static class Handler implements Runnable { ... }

然后做

final Thread serverThread = new Thread(new Handler());
serverThread.start();
© www.soinside.com 2019 - 2024. All rights reserved.