当前位置: 代码迷 >> J2SE >> 这个程序如何改,才能让它出现多线程有关问题
  详细解决方案

这个程序如何改,才能让它出现多线程有关问题

热度:113   发布时间:2016-04-23 19:41:11.0
这个程序怎么改,才能让它出现多线程问题
这个程序怎么改,才能让它出现多线程问题
public class ThreadTest{
public static void main(String[] args) {
User user = new User();
for (int i = 0; i < 10000; i++) {
Thread t = new Thread(new Runnable() {
public void run() {
 user.add();
}
});
t.start();
}
}
}

class User {
private static final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd mm:hh:ss");
public void add() {
System.out.println(dateFormat.format(new Date()) + " - " + Thread.currentThread().getName());
}
}

------解决思路----------------------
每个线程的执行时间太短,没等到调度就结束了。
add方法稍微改一下就行了:
	public void add() {
while (true)
System.out.println(dateFormat.format(new Date()) + " - "
+ Thread.currentThread().getName());
}

运行一会之后能明显看到异常数据。
------解决思路----------------------


public class ThreadTest extends Thread{
private static int total = 100;
private static String str = "str";  
/* (non-Javadoc)
 * @see java.lang.Thread#run()
 */
@Override
public  void run() {
while(total >=1){
total --;
System.out.println("ThreadName:"+Thread.currentThread().getName()+"当前剩余数:"+total);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new ThreadTest().start();
new ThreadTest().start();
}
}

------解决思路----------------------
format好像看不大出来
parse比较容易出的
------解决思路----------------------
引用:
Quote: 引用:

每个线程的执行时间太短,没等到调度就结束了。
add方法稍微改一下就行了:
	public void add() {
while (true)
System.out.println(dateFormat.format(new Date()) + " - "
+ Thread.currentThread().getName());
}

运行一会之后能明显看到异常数据。

我试了下,运行了几分钟还是没有出现问题,jdk1.8

我记得在多线程调用Dateformart时,是有可能会出现调用的异常的。

如果我想写个多线程情况下调用产生问题的例子,请教下应该怎么写。我这个是不是思路问题:

多线程下调用非线程安全的方法,应该会报错的。


非线程安全的意思又不是在多个线程访问的时候就会报错。。它的意思是该方法不实现线程同步机制,多线程访问时可能出现数据错误,不会抛出异常。

如果你想触发一个线程同步错误,那你只能从数据的角度来触发:比如说多个线程访问同一个变量(至少有一些线程会修改该变量,有一些会读取该变量),然后你就会发现有一些线程所做的修改没有生效,有一些线程读取的数据不是最新的。。。

还有另一个问题就是乱序执行,线程start的顺序和它们实际执行的顺序没有关系。先开始的线程可能后执行。
  相关解决方案