Java 点击按钮后停止线程

Java 点击按钮后停止线程,java,android,Java,Android,我在上创建了一个线程,并在单击按钮时调用该线程: btnUpload.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new ClientThread()).start(); } }); 这是我的主线: class ClientThread implements Runnable { @

我在上创建了一个线程,并在单击按钮时调用该线程:

btnUpload.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
         new Thread(new ClientThread()).start();
    }
});
这是我的主线:

class ClientThread implements Runnable {

        @Override
        public void run() {

            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);

                socket = new Socket(serverAddr, SERVERPORT);

            } catch (UnknownHostException e1) {
                e1.printStackTrace();

            } catch (IOException e1) {
                e1.printStackTrace();

            }

        }

    }
我需要停止按钮点击后的行动线程。我该怎么做?我尝试过布尔、中断方法,但不起作用。我怎样才能阻止它?请帮助我。

每当单击按钮或事件发生时(只要您愿意),调用线程上的
wait()
方法,然后再次调用
notify()
方法以恢复线程

每当单击按钮或事件发生时(只要您愿意),调用线程上的
wait()
方法,然后再次调用
notify()
恢复线程的方法

private Thread thread = new Thread(new ClientThread());
private boolean isStarted = false;
btnUpload.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (!isStarted)
                thread.start();
            else
                thread.stop();
    }
});
试试这个

试试这个。

试试这个测试代码:

public class Test3 {
    public static void main(String[] args) throws InterruptedException, IOException {
        Thread serverThread = new Thread(new ServerThread());
        serverThread.start();

        ClientThread client = new ClientThread();
        Thread clientThread = new Thread(client);
        clientThread.start();
        Thread.sleep(5000);
        client.closeSocket();
    }
}

class ServerThread implements Runnable {
    @Override
    public void run() {
        try {
            ServerSocket serverSocket = new ServerSocket(7777);
            serverSocket.accept();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

class ClientThread implements Runnable {
    Socket socket;

    public void closeSocket() throws IOException {
        socket.close();
    }

    @Override
    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName("127.0.0.1");
            socket = new Socket(serverAddr, 7777);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
这将成功关闭套接字并退出线程。

请尝试以下测试代码:

public class Test3 {
    public static void main(String[] args) throws InterruptedException, IOException {
        Thread serverThread = new Thread(new ServerThread());
        serverThread.start();

        ClientThread client = new ClientThread();
        Thread clientThread = new Thread(client);
        clientThread.start();
        Thread.sleep(5000);
        client.closeSocket();
    }
}

class ServerThread implements Runnable {
    @Override
    public void run() {
        try {
            ServerSocket serverSocket = new ServerSocket(7777);
            serverSocket.accept();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

class ClientThread implements Runnable {
    Socket socket;

    public void closeSocket() throws IOException {
        socket.close();
    }

    @Override
    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName("127.0.0.1");
            socket = new Socket(serverAddr, 7777);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

这将成功地关闭套接字并退出线程。

我想您要做的是启动套接字,然后等待某个事件(例如,单击按钮),然后停止它。您可以使用受保护的块来等待标志

你的班级将是这样的

class ClientThread implements Runnable {

    private static final int SERVERPORT = 0;
    private static final String SERVER_IP = null;
    Socket socket;
    boolean stopFlag;

    public ClientThread(){
        stopFlag = false;
    }

    public void setStopFlag(){
        stopFlag = true;
    }

    @Override
    public void run() {

        try {
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
            socket = new Socket(serverAddr, SERVERPORT);
            synchronized(this){
                while(!stopFlag){
                    try {
                        wait();
                    } catch (InterruptedException e) {}
                }
            }
            socket.close();

        } catch (UnknownHostException e1) {
            e1.printStackTrace();

        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }

}
启动clientThread时,保持实例,以便稍后可以发出信号

ClientThread ct = new ClientThread();
new Thread(ct).start();
当您想停止插座时(例如,点击按钮),请执行此操作

更多关于防护块的信息可以在这里找到-

我建议您阅读整个java并发教程-


并发是一个非常有趣和富有挑战性的话题。启动线程的语法可能很简单,但不要让它误导您

我猜您要做的是启动套接字,然后等待某个事件(例如,单击按钮),然后停止它。您可以使用受保护的块来等待标志

你的班级将是这样的

class ClientThread implements Runnable {

    private static final int SERVERPORT = 0;
    private static final String SERVER_IP = null;
    Socket socket;
    boolean stopFlag;

    public ClientThread(){
        stopFlag = false;
    }

    public void setStopFlag(){
        stopFlag = true;
    }

    @Override
    public void run() {

        try {
            InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
            socket = new Socket(serverAddr, SERVERPORT);
            synchronized(this){
                while(!stopFlag){
                    try {
                        wait();
                    } catch (InterruptedException e) {}
                }
            }
            socket.close();

        } catch (UnknownHostException e1) {
            e1.printStackTrace();

        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }

}
启动clientThread时,保持实例,以便稍后可以发出信号

ClientThread ct = new ClientThread();
new Thread(ct).start();
当您想停止插座时(例如,点击按钮),请执行此操作

更多关于防护块的信息可以在这里找到-

我建议您阅读整个java并发教程-


并发是一个非常有趣和富有挑战性的话题。启动线程的语法可能很简单,但不要让它误导您

你能解释一下吗?这些方法在多线程的情况下使用!我建议您在使用类方法之前先阅读它们的API。多线程??对对于您的信息,main方法也是一个线程。所以当你创建另一个线程时,你不是有多个线程吗???首先理解线程的概念,然后使用它们。你能解释一下吗?这些方法在多线程的情况下使用!我建议您在使用类方法之前先阅读它们的API。多线程??对对于您的信息,main方法也是一个线程。所以当你创建另一个线程时,你不是有多个线程吗???首先理解线程的概念,然后使用它们。当线程的运行方法结束时,线程将结束其生命周期。您可以参考Hope,这会有所帮助。停止线程可能意味着关闭在
run()
中创建的套接字?是@mangusta,您是对的。但是如何关闭呢?@androidsuckzzz将该套接字作为
ClientThread
的实例变量,并在必要时放置一些mutator方法来关闭它,或者通过直接从
ClientThread
objectThreads调用来关闭它。当其run方法结束时,objectThreads将结束它的生命周期。您可以参考Hope这有帮助。可能通过停止线程,您的意思是关闭在
run()
中创建的套接字?是的@mangusta,您是对的。但是怎么做呢?@androidsuckzzz将该套接字作为
ClientThread
的一个实例变量,并在必要时放置一些mutator方法来关闭它,或者直接从
ClientThread
object调用来关闭它。这个不会工作,这是折旧。这个不会工作,这是折旧。