线程退出run方法,是否代表该线程结束 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 boolean isAlive() 测试线程是否处于活动状态。 应该不时,线程是又start方法开始的,所以也应该是start方法结束才能算线程结束了,run方法只是在start方法中被调用,给我们为线程提供其所需作的操作。在run方法结束后,线程结束前应该还有一些操作需要执行,如内存释放之类的。纯属个人理解 比如在Windows里,线程函数之后要通知每个已经加载的DLL线程即将结束, 应该不算结束,run就好比你吃饭这个行为,你吃完饭了,不能说拍拍屁股走人了,总得收拾一下吧,不然你妈要教训你的 其实你可以理解为run方法执行完了。这个线程也就结束了。不过也可以通过getState() 查看该线程的状态。 isInterrupted() 查看线程是否已经中断。 退出run方法。1.异常。2.正常执行完成。要做的事情都完了,就相当于结束了。 所以也应该是start方法结束才能算线程结束了真的吗??????? 不是,run方法结束之后还要执行相关的内存释放操作。 package myswing;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;public class LuckyDraw implements ActionListener { String[] str = null; JLabel jl = null; boolean isEnd = true; ExecutorService ex = Executors.newFixedThreadPool(2); public static void main(String[] args) { new LuckyDraw(); } public LuckyDraw() { str = new String[]{"1:胡锦涛","2:吴邦国","3:温家宝","4:贾庆林","5:贾庆林","6:习近平","7:李克强" ,"8:贺国强","9:周永康","10:王 刚","11:王乐泉","12:王兆国","13:王岐山","14:回良玉","15:刘 淇","16:刘云山" ,"17:李源潮","18: 汪 洋","19:张德江","20:俞正声","21:徐才厚","22:郭伯雄","23:薄熙来","24:令计划","25:王沪宁", "26:孟建柱","27:王胜俊","28:王胜俊"}; JFrame jf = new JFrame(); jl = new JLabel("究竟谁是下一届主席呢?"); JButton jb = new JButton("开始"); JButton jb1 = new JButton("结束"); JPanel jp = new JPanel(); jp.setLayout(new GridLayout(1,2)); jf.add(jl); jp.add(jb); jp.add(jb1); jf.add(jp,BorderLayout.SOUTH); jb.addActionListener(this); jb1.addActionListener(this); jf.setTitle("幸运抽奖"); jf.setLocation(400,400); jf.setSize(200,200); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); if(command.equals("开始")){ if(isEnd) { isEnd = false; Thread t = new Thread(new MyRun()); try { Thread.sleep(200); t.start(); } catch (InterruptedException e1) { e1.printStackTrace(); } } ex.shutdown(); }else { Thread t = new Thread(new MyRun1()); t.start(); } } class MyRun implements Runnable { Lock lock = new ReentrantLock(); public void run() { while(!isEnd){ try { lock.lock(); Thread.sleep(20); String name = str[new Random().nextInt(str.length)]; jl.setText(name); } catch (InterruptedException e1) { e1.printStackTrace(); } lock.unlock(); } } } class MyRun1 implements Runnable { public void run() { isEnd = true; } }}这是可以运行的程序package myswing;import java.awt.BorderLayout;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Random;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;public class CopyOfLuckyDraw implements ActionListener { String[] str = null; JLabel jl = null; boolean isEnd = true; ExecutorService ex = Executors.newFixedThreadPool(2); public static void main(String[] args) { new CopyOfLuckyDraw(); } public CopyOfLuckyDraw() { str = new String[] { "1:胡锦涛", "2:吴邦国", "3:温家宝", "4:贾庆林", "5:贾庆林", "6:习近平", "7:李克强", "8:贺国强", "9:周永康", "10:王 刚", "11:王乐泉", "12:王兆国", "13:王岐山", "14:回良玉", "15:刘 淇", "16:刘云山", "17:李源潮", "18: 汪 洋", "19:张德江", "20:俞正声", "21:徐才厚", "22:郭伯雄", "23:薄熙来", "24:令计划", "25:王沪宁", "26:孟建柱", "27:王胜俊", "28:王胜俊" }; JFrame jf = new JFrame(); jl = new JLabel("究竟谁是下一届主席呢?"); JButton jb = new JButton("开始"); JButton jb1 = new JButton("结束"); JPanel jp = new JPanel(); jp.setLayout(new GridLayout(1, 2)); jf.add(jl); jp.add(jb); jp.add(jb1); jf.add(jp, BorderLayout.SOUTH); jb.addActionListener(this); jb1.addActionListener(this); jf.setTitle("幸运抽奖"); jf.setLocation(400, 400); jf.setSize(200, 200); jf.setVisible(true); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); if (command.equals("开始")) { if (isEnd) { isEnd = false; while (!isEnd) try { Thread.sleep(20); String name = str[new Random().nextInt(str.length)]; jl.setText(name); if (isEnd == true) break; } catch (Exception e1) { e1.printStackTrace(); } } ex.shutdown(); } else { Thread t = new Thread(new MyRun1()); t.start(); } } class MyRun1 implements Runnable { public void run() { isEnd = true; } }}这是不可以运行的程序,我在想,为什么不可以把设置label值的代码放到主线程里面运行,而要另外开一个线程来运行。有人的解释是说你不可能让主线程停止运行啊。我在想,我并非让他停止运行,我只是让他跳出这个设置label值的代码啊,所以提了上面的问题 应该不是 main方法是主线程 要等把代码全都执行完了才结束 意思也就是 线程与程序是同时开始同时结束的 所以线程的结束应该与run方法没有什么关系吧 我觉得这个,很多种说法,线程结束,怎样才算结束呢?boolean isAlive()判断false大致就可以认为线程结束了。 这个肯定不对了,start方法只是通知一下要开始执行,马上返回的。 java里 线程是个很不听话的东东~~~~你让他开始·~~他不一定是立刻开始(由其是多线程的时候,开一堆线程)你让他结束的时候·~~他有时候会莫名其妙的死等,有时候会延时结束~~~它的结束时间是系统决定的·~~ isInterrupted() 查看线程是否已经中断 请教怎样修改JDK中的一个类的函数 Java Web Start 和 axis2 为什么该方法不能使纵坐标显示百分比?? 如何将会车换行符、,替换成空格! 怎么让JTable的表头(TableHeader)可编辑? 跪求:jdk1.5.0如何实现BMP图片的保存? 请提供ultraedit-32版本的序列号 用JDBC操作oracle数据库,回滚无效,欲哭无泪中...帮帮忙 急!!!如何求2次以上方根值 奇怪的加密问题,请大虾帮忙 判断单向链表有循环的算法(只给最佳答案50分) 关于java中私有方法,属性继承的问题!
boolean isAlive()
测试线程是否处于活动状态。
run方法只是在start方法中被调用,给我们为线程提供其所需作的操作。在run方法结束后,线程结束前应该还有一些操作需要执行,如内存释放之类的。
纯属个人理解
不过也可以通过
getState() 查看该线程的状态。
isInterrupted() 查看线程是否已经中断。
1.异常。
2.正常执行完成。
要做的事情都完了,就相当于结束了。
真的吗???????
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;public class LuckyDraw implements ActionListener {
String[] str = null;
JLabel jl = null;
boolean isEnd = true;
ExecutorService ex = Executors.newFixedThreadPool(2);
public static void main(String[] args) {
new LuckyDraw();
}
public LuckyDraw() {
str = new String[]{"1:胡锦涛","2:吴邦国","3:温家宝","4:贾庆林","5:贾庆林","6:习近平","7:李克强"
,"8:贺国强","9:周永康","10:王 刚","11:王乐泉","12:王兆国","13:王岐山","14:回良玉","15:刘 淇","16:刘云山"
,"17:李源潮","18: 汪 洋","19:张德江","20:俞正声","21:徐才厚","22:郭伯雄","23:薄熙来","24:令计划","25:王沪宁",
"26:孟建柱","27:王胜俊","28:王胜俊"};
JFrame jf = new JFrame();
jl = new JLabel("究竟谁是下一届主席呢?");
JButton jb = new JButton("开始");
JButton jb1 = new JButton("结束");
JPanel jp = new JPanel();
jp.setLayout(new GridLayout(1,2));
jf.add(jl);
jp.add(jb);
jp.add(jb1);
jf.add(jp,BorderLayout.SOUTH);
jb.addActionListener(this);
jb1.addActionListener(this);
jf.setTitle("幸运抽奖");
jf.setLocation(400,400);
jf.setSize(200,200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if(command.equals("开始")){
if(isEnd) {
isEnd = false;
Thread t = new Thread(new MyRun());
try {
Thread.sleep(200);
t.start();
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
ex.shutdown();
}else {
Thread t = new Thread(new MyRun1());
t.start();
}
}
class MyRun implements Runnable {
Lock lock = new ReentrantLock();
public void run() {
while(!isEnd){
try {
lock.lock();
Thread.sleep(20);
String name = str[new Random().nextInt(str.length)];
jl.setText(name);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
lock.unlock();
}
}
}
class MyRun1 implements Runnable {
public void run() {
isEnd = true;
}
}
}这是可以运行的程序
package myswing;import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;public class CopyOfLuckyDraw implements ActionListener {
String[] str = null;
JLabel jl = null;
boolean isEnd = true;
ExecutorService ex = Executors.newFixedThreadPool(2); public static void main(String[] args) {
new CopyOfLuckyDraw();
} public CopyOfLuckyDraw() { str = new String[] { "1:胡锦涛", "2:吴邦国", "3:温家宝", "4:贾庆林", "5:贾庆林",
"6:习近平", "7:李克强", "8:贺国强", "9:周永康", "10:王 刚", "11:王乐泉",
"12:王兆国", "13:王岐山", "14:回良玉", "15:刘 淇", "16:刘云山", "17:李源潮",
"18: 汪 洋", "19:张德江", "20:俞正声", "21:徐才厚", "22:郭伯雄", "23:薄熙来",
"24:令计划", "25:王沪宁", "26:孟建柱", "27:王胜俊", "28:王胜俊" };
JFrame jf = new JFrame();
jl = new JLabel("究竟谁是下一届主席呢?");
JButton jb = new JButton("开始");
JButton jb1 = new JButton("结束");
JPanel jp = new JPanel();
jp.setLayout(new GridLayout(1, 2));
jf.add(jl);
jp.add(jb);
jp.add(jb1);
jf.add(jp, BorderLayout.SOUTH);
jb.addActionListener(this);
jb1.addActionListener(this);
jf.setTitle("幸运抽奖");
jf.setLocation(400, 400);
jf.setSize(200, 200);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (command.equals("开始")) {
if (isEnd) {
isEnd = false;
while (!isEnd)
try {
Thread.sleep(20);
String name = str[new Random().nextInt(str.length)];
jl.setText(name);
if (isEnd == true)
break;
} catch (Exception e1) {
e1.printStackTrace();
}
}
ex.shutdown();
} else {
Thread t = new Thread(new MyRun1());
t.start();
} } class MyRun1 implements Runnable {
public void run() {
isEnd = true;
} }
}
这是不可以运行的程序,我在想,为什么不可以把设置label值的代码放到主线程里面运行,而要另外开一个线程来运行。有人的解释是说你不可能让主线程停止运行啊。我在想,我并非让他停止运行,我只是让他跳出这个设置label值的代码啊,所以提了上面的问题
你让他结束的时候·~~他有时候会莫名其妙的死等,有时候会延时结束~~~它的结束时间是系统决定的·~~