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调用来关闭它。这个不会工作,这是折旧。这个不会工作,这是折旧。