import java.util.List;
import java.util.Vector;public class synchronizedDemo {
public static void main(String[] args) {
Resource rs = new Resource();
myThread mythA = new myThread(rs);
mythA.start();
System.out.println(rs.list);
}
}class Resource {
List<Integer> list = new Vector<Integer>();
}class myThread extends Thread {
Resource rs; public myThread(Resource rs) {
this.rs = rs;
} public void add(){
for (int i = 0; i < 20; i++) {
rs.list.add(i);
System.out.println("aaaaaaaaaaaaa");
}
}
public void run() {
add();
}
}
打印结果为:[]
mport java.util.ArrayList;
import java.util.List;public class A {
public static void main(String[] args){
C c = new C();
B b = new B(c);
b.setA();
System.out.println(c.list);
}
}
class B{
C c;
B(C c){
this.c = c;
}
public void setA(){
for(int i =1; i<21;i++){
c.list.add(Integer.valueOf(i));
}
}
}
class C{
List<Integer> list = new ArrayList<Integer>();
}
打印结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
import java.util.Vector;public class synchronizedDemo {
public static void main(String[] args) {
Resource rs = new Resource();
myThread mythA = new myThread(rs);
mythA.start();
System.out.println(rs.list);
}
}class Resource {
List<Integer> list = new Vector<Integer>();
}class myThread extends Thread {
Resource rs; public myThread(Resource rs) {
this.rs = rs;
} public void add(){
for (int i = 0; i < 20; i++) {
rs.list.add(i);
System.out.println("aaaaaaaaaaaaa");
}
}
public void run() {
add();
}
}
打印结果为:[]
mport java.util.ArrayList;
import java.util.List;public class A {
public static void main(String[] args){
C c = new C();
B b = new B(c);
b.setA();
System.out.println(c.list);
}
}
class B{
C c;
B(C c){
this.c = c;
}
public void setA(){
for(int i =1; i<21;i++){
c.list.add(Integer.valueOf(i));
}
}
}
class C{
List<Integer> list = new ArrayList<Integer>();
}
打印结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
前者使用了多线程,主线程在执行System.out.println(rs.list);的时候不能保证rs里面有值。
后者则是正常的执行顺序,当list里面的元素添加完后,主程序才开始打印
mythA.start();执行后,线程等系统调用开始执行其run函数
System.out.println(rs.list);//这条语句在当前线程继续执行
如果执行时,另外那个线程的run还没执行,那么打印出来就是空的
如果执行了一半,打印出来可能是有1个或2个或3个....数字
那我用sleep试试
Thread.sleep(2000);
}catch(Exception e){
e.printStackTrace();
}我加了一段,测试成功了
另外我想问问大家:
Vector 该类的功能方法是同步的,同一时刻只能有一个线程访问.能不能写个实例多个线程同时访问Vector。谢谢
用join才能保证
public static void main(String[] args) {
Resource rs = new Resource();
myThread mythA = new myThread(rs);
mythA.start();
while(mythA.isAlive()) {
}
System.out.println(rs.list);
}
谁帮忙写个实例能体现 《1》同步《2》2个线程访问会报错?
我是新手就是整了老半天,用一Vector的对象向两个线程传参弄不上