A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵哲成 中级黑马   /  2014-11-23 23:22  /  1433 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

11 个回复

倒序浏览
线程的切换问题。
我跑了你的代码好多遍
出现了一次这样的情况
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线程。
也可能是三个线程随机执行。

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
便于观察的话,可以把数组改大一点。
比如600或者6000这样
毕竟现在PC的CPU执行的速度是非常快的。
回复 使用道具 举报
javaAndroid 发表于 2014-11-23 23:37
线程的切换问题。
我跑了你的代码好多遍
出现了一次这样的情况

那该怎么做? 设置一个boolean来进行切换? 帮我改下呗:#
回复 使用道具 举报
我提几个问题吧, 你看一下。
往线程里传数组不用 new,直接声明出来就行了。
我认为这个暂停一段时间应该用wait或者sleep。
Thread 有异常

评分

参与人数 1技术分 +1 收起 理由
杨佳名 + 1

查看全部评分

回复 使用道具 举报
javaAndroid 发表于 2014-11-23 23:38
便于观察的话,可以把数组改大一点。
比如600或者6000这样
毕竟现在PC的CPU执行的速度是非常快的。 ...

怎么进行切换线程
回复 使用道具 举报
赵哲成 发表于 2014-11-23 23:42
那该怎么做? 设置一个boolean来进行切换? 帮我改下呗

怎么能先让线程t1 t2.线执行
回复 使用道具 举报
qq8921310 发表于 2014-11-23 23:44
我提几个问题吧, 你看一下。
往线程里传数组不用 new,直接声明出来就行了。
我认为这个暂停一段时间应该 ...

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

怎么能让t1.t2 先于主函数执行!!!
回复 使用道具 举报
改为这样貌似就容易观察了只改动主函数了。
两个线程的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. }
复制代码



回复 使用道具 举报
赵哲成 发表于 2014-11-23 23:54
怎么能让t1.t2 先于主函数执行!!!

让主函数  睡一会 或者等待。你在run方法里开启就行了。
回复 使用道具 举报
想要让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()方法调用顺序也有点讲究
你可以换一下位置观察一下。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马