黑马程序员技术交流社区

标题: 为什么没有对外面的数组赋值 [打印本页]

作者: 赵哲成    时间: 2014-11-23 23:22
标题: 为什么没有对外面的数组赋值
  1. package com.itheima;

  2. /**
  3. * 2、声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),
  4.     给数组中添加数据,每一个线程为数组添加3个数据即可。
  5. */
  6. public class Test2 {

  7.         public static void main(String[] args) throws Exception {
  8.                 // TODO Auto-generated method stub
  9.                 int arys[] = new int[6];
  10.                 thread1 T1 = new thread1(arys);
  11.                 thread2 T2 = new thread2(arys);
  12.                 Thread t1 = new Thread(T1);
  13.                 Thread t2 = new Thread(T2);
  14.                 t1.start();
  15.                 t2.start();
  16.                 for (int i = 0; i < arys.length; i++) {
  17.                         System.out.println(arys[i]);
  18.                 }
  19.         }
  20. }
  21. class thread1 implements Runnable{
  22.         private int arys[] = new int[6];
  23.         public thread1(int[] arys) {
  24.                 // TODO Auto-generated constructor stub
  25.                 this.arys = arys;
  26.         }
  27.         @Override
  28.         public void run() {
  29.                 // TODO Auto-generated method stub
  30.                 synchronized (arys) {
  31.                         for(int i = 0 ;i < 3 ; i++){
  32.                                 arys[i] = i;
  33.                                 System.out.println("thread1 " +"arys :" + arys[i]);
  34.                         }
  35.                 }
  36.         }
  37.        
  38. }
  39. class thread2 implements Runnable{
  40.         private int arys[] = new int[6];
  41.         public thread2(int[] arys) {
  42.                 // TODO Auto-generated constructor stub
  43.                 this.arys = arys;
  44.         }
  45.         @Override
  46.         public void run() {
  47.                 // TODO Auto-generated method stub
  48.                 synchronized (arys) {
  49.                         for(int i = 3 ;i < 6 ; i++){
  50.                                 arys[i] = i;
  51.                                 System.out.println("thread2 " +"arys :" + arys[i]);
  52.                         }
  53.                 }
  54.         }
  55.        
  56. }
复制代码

作者: javaAndroid    时间: 2014-11-23 23:37
线程的切换问题。
我跑了你的代码好多遍
出现了一次这样的情况
0
0
0
3
0
0
thread2 arys :3
thread2 arys :4
thread2 arys :5
thread1 arys :0
thread1 arys :1
thread1 arys :2
start开启线程之后不一定会马上得到执行
所以就可能是main函数的线程执行完了
才执行到t1和t2线程。
也可能是三个线程随机执行。
作者: javaAndroid    时间: 2014-11-23 23:38
便于观察的话,可以把数组改大一点。
比如600或者6000这样
毕竟现在PC的CPU执行的速度是非常快的。
作者: 赵哲成    时间: 2014-11-23 23:42
javaAndroid 发表于 2014-11-23 23:37
线程的切换问题。
我跑了你的代码好多遍
出现了一次这样的情况

那该怎么做? 设置一个boolean来进行切换? 帮我改下呗:#
作者: qq8921310    时间: 2014-11-23 23:44
我提几个问题吧, 你看一下。
往线程里传数组不用 new,直接声明出来就行了。
我认为这个暂停一段时间应该用wait或者sleep。
Thread 有异常
作者: 赵哲成    时间: 2014-11-23 23:50
javaAndroid 发表于 2014-11-23 23:38
便于观察的话,可以把数组改大一点。
比如600或者6000这样
毕竟现在PC的CPU执行的速度是非常快的。 ...

怎么进行切换线程

作者: 赵哲成    时间: 2014-11-23 23:52
赵哲成 发表于 2014-11-23 23:42
那该怎么做? 设置一个boolean来进行切换? 帮我改下呗

怎么能先让线程t1 t2.线执行

作者: 赵哲成    时间: 2014-11-23 23:53
qq8921310 发表于 2014-11-23 23:44
我提几个问题吧, 你看一下。
往线程里传数组不用 new,直接声明出来就行了。
我认为这个暂停一段时间应该 ...

怎么能让t1.t2 先于主函数执行!!!
作者: 赵哲成    时间: 2014-11-23 23:54
qq8921310 发表于 2014-11-23 23:44
我提几个问题吧, 你看一下。
往线程里传数组不用 new,直接声明出来就行了。
我认为这个暂停一段时间应该 ...

怎么能让t1.t2 先于主函数执行!!!
作者: javaAndroid    时间: 2014-11-24 00:00
改为这样貌似就容易观察了只改动主函数了。
两个线程的for循环也要改一下数值。0-30和30-60.
  1. int arys[] = new int[60];
  2. new Thread(new thread1(arys)).start();
  3. new Thread(new thread2(arys)).start();
  4. for (int i = 0; i < arys.length; i++) {
  5.         System.out.println(arys[i]);
  6. }
复制代码




作者: qq8921310    时间: 2014-11-24 09:40
赵哲成 发表于 2014-11-23 23:54
怎么能让t1.t2 先于主函数执行!!!

让主函数  睡一会 或者等待。你在run方法里开启就行了。
作者: javaAndroid    时间: 2014-11-24 11:24
想要让t1和t2先执行
可以使用线程对象的join()方法
  1. int arys[] = new int[6];
  2. thread1 T1 = new thread1(arys);
  3. thread2 T2 = new thread2(arys);
  4. Thread t1 = new Thread(T1);
  5. Thread t2 = new Thread(T2);
  6. t1.start();
  7. t2.start();
  8. t2.join();
  9. t1.join();
  10. for (int i = 0; i < arys.length; i++) {
  11.         System.out.println(arys[i]);
  12. }
复制代码

t1和t2的join()方法调用顺序也有点讲究
你可以换一下位置观察一下。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2