/**
*测试Runnable线程可以共享实例变量
*/
public class TestRunnable implements Runnable
{
private int i;
public void run()
{
i++;
System.out.println(Thread.currentThread().getName()+" i="+i);
}
public static void main(String[] args)
{
TestRunnable st = new TestRunnable();
for (int i = 0; i < 100; i++){
new Thread(st , "新线程"+i).start();
}
}
}
使用相同的Runnable创建了100个线程,每个线程对其i变量加一并输出,可发现100个线程输出的i是连续的。
新线程0 i=1
新线程5 i=6
新线程4 i=5
新线程3 i=4
新线程2 i=3
新线程1 i=2
新线程10 i=11
新线程20 i=10
新线程8 i=9
新线程15 i=13
新线程18 i=8
新线程6 i=7
新线程12 i=18
新线程11 i=17
新线程19 i=16
新线程26 i=26
新线程25 i=28
新线程7 i=15
新线程14 i=14
新线程13 i=12
新线程29 i=30
新线程28 i=29
新线程27 i=27
新线程24 i=22
新线程9 i=21
新线程17 i=25
新线程21 i=25
新线程22 i=25
新线程23 i=21
新线程16 i=19
新线程43 i=44
新线程42 i=43
新线程41 i=42
新线程40 i=42
新线程39 i=40
新线程38 i=39
新线程36 i=38
新线程37 i=38
新线程35 i=36
新线程34 i=35
新线程33 i=34
新线程32 i=33
新线程30 i=32
新线程31 i=31
新线程64 i=100
新线程87 i=100
新线程63 i=100
新线程71 i=98
新线程60 i=97
新线程59 i=95
新线程58 i=94
新线程55 i=93
新线程70 i=92
新线程69 i=91
新线程66 i=91
新线程68 i=90
新线程51 i=88
新线程73 i=87
新线程67 i=87
新线程62 i=85
新线程77 i=84
新线程65 i=83
新线程81 i=82
新线程84 i=81
新线程72 i=81
新线程61 i=80
新线程56 i=77
新线程57 i=78
新线程75 i=76
新线程88 i=75
新线程54 i=74
新线程52 i=74
新线程78 i=73
新线程85 i=72
新线程86 i=70
新线程53 i=71
新线程74 i=70
新线程76 i=60
新线程82 i=68
新线程91 i=67
新线程79 i=67
新线程95 i=65
新线程50 i=64
新线程49 i=63
新线程89 i=62
新线程90 i=59
新线程80 i=59
新线程83 i=58
新线程98 i=56
新线程92 i=55
新线程94 i=55
新线程93 i=54
新线程96 i=52
新线程97 i=51
新线程99 i=50
新线程47 i=49
新线程48 i=49
新线程46 i=47
新线程45 i=46
新线程44 i=45
但是如果使用不同的Runnable实例,那么他们将都是输出1。
比如将上例中main方法中的创建Runnable放入for循环内。
TestRunnable st = new TestRunnable();
for (int i = 0; i < 100; i++){
new Thread(st , "新线程"+i).start();
}
那么其输出就不会共享变量i
新线程0 i=1
新线程5 i=1
新线程6 i=1
新线程4 i=1
新线程3 i=1
新线程2 i=1
新线程1 i=1
新线程16 i=1
新线程15 i=1
新线程14 i=1
新线程12 i=1
新线程11 i=1
新线程10 i=1
新线程9 i=1
新线程8 i=1
新线程7 i=1
新线程33 i=1
新线程32 i=1
新线程31 i=1
新线程30 i=1
新线程29 i=1
新线程28 i=1
新线程27 i=1
新线程26 i=1
新线程25 i=1
新线程24 i=1
新线程23 i=1
新线程22 i=1
新线程21 i=1
新线程20 i=1
新线程19 i=1
新线程18 i=1
新线程17 i=1
新线程70 i=1
新线程50 i=1
新线程62 i=1
新线程79 i=1
新线程64 i=1
新线程53 i=1
新线程51 i=1
新线程54 i=1
新线程52 i=1
新线程57 i=1
新线程71 i=1
新线程55 i=1
新线程56 i=1
新线程58 i=1
新线程69 i=1
新线程76 i=1
新线程89 i=1
新线程59 i=1
新线程88 i=1
新线程66 i=1
新线程72 i=1
新线程61 i=1
新线程60 i=1
新线程80 i=1
新线程63 i=1
新线程13 i=1
新线程65 i=1
新线程67 i=1
新线程87 i=1
新线程68 i=1
新线程75 i=1
新线程73 i=1
新线程74 i=1
新线程77 i=1
新线程78 i=1
新线程81 i=1
新线程82 i=1
新线程85 i=1
新线程83 i=1
新线程84 i=1
新线程86 i=1
新线程90 i=1
新线程96 i=1
新线程91 i=1
新线程93 i=1
新线程92 i=1
新线程94 i=1
新线程95 i=1
新线程97 i=1
新线程99 i=1
新线程98 i=1
新线程49 i=1
新线程48 i=1
新线程47 i=1
新线程46 i=1
新线程45 i=1
新线程44 i=1
新线程43 i=1
新线程42 i=1
新线程41 i=1
新线程40 i=1
新线程39 i=1
新线程38 i=1
新线程37 i=1
新线程36 i=1
新线程35 i=1
新线程34 i=1