这个程序怎么改,才能让它出现多线程问题
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比较容易出的
------解决思路----------------------
非线程安全的意思又不是在多个线程访问的时候就会报错。。它的意思是该方法不实现线程同步机制,多线程访问时可能出现数据错误,不会抛出异常。
如果你想触发一个线程同步错误,那你只能从数据的角度来触发:比如说多个线程访问同一个变量(至少有一些线程会修改该变量,有一些会读取该变量),然后你就会发现有一些线程所做的修改没有生效,有一些线程读取的数据不是最新的。。。
还有另一个问题就是乱序执行,线程start的顺序和它们实际执行的顺序没有关系。先开始的线程可能后执行。