黑马程序员技术交流社区

标题: 声明一个共享数组,起两个线程,两个线程分别隔一段时... [打印本页]

作者: 张周飞    时间: 2015-1-15 11:49
标题: 声明一个共享数组,起两个线程,两个线程分别隔一段时...
    声明一个共享数组,起两个线程,两个线程分别隔一段时间(可以写一个随机数),给数组中添加数据,每一个线程为数组添加3个数据即可。

求代码  求思路?????{:3_46:}

作者: Mr.JUN    时间: 2015-1-15 11:49
我的思路:两个线程用同一个锁(如ThreadDemo.class作为锁),一个添加一个数据完成后,把锁让出来给另一个线程
添加数据
作者: 冰川    时间: 2015-1-15 17:05

  1. public class MultiThread{

  2.        
  3.         private String[] sharedArray = new String[6];
  4.        
  5.         private int currentIndex = 0;
  6.        
  7.        
  8.         public class MyThread extends Thread{
  9.                 public void run(){
  10.                        
  11.                         for (int i = 0; i < 3; i++) {
  12.                                 addItem();
  13.                                 try {
  14.                                         Thread.sleep(2000);
  15.                                 } catch (InterruptedException e) {
  16.                                 };
  17.                         }
  18.                        
  19.                 }
  20.                
  21.         }
  22.        
  23.         public synchronized void addItem(){
  24.                 String someThing = "someThing";
  25.                 this.sharedArray[this.currentIndex] = someThing;
  26.                 this.currentIndex++;
  27.         }
  28.         public static void main(String[] args) {
  29.                 MultiThread mt = new MultiThread();
  30.                 MyThread th1 = mt.new MyThread();
  31.                 MyThread th2 = mt.new MyThread();
  32.                 th1.start();
  33.                 th2.start();
  34.                 try {
  35.                         th1.join();
  36.                         th2.join();
  37.                 } catch (InterruptedException e) {
  38.                 }
  39.                 for (int i = 0; i < mt.sharedArray.length; i++) {
  40.                         System.out.println(mt.sharedArray[i]);
  41.                 }
  42.         }
  43. }
复制代码
是想要这种吗

作者: 邓士林    时间: 2015-1-16 00:10
本帖最后由 邓士林 于 2015-1-16 00:11 编辑
  1. class ArrayThread implements Runnable
  2. {
  3.         public String a[] = new String[6];
  4.         private String name;
  5.         private int index = 0;
  6.         public ArrayThread(String name)
  7.         {
  8.                 this.name = name;
  9.         }

  10.         public void run()
  11.         {
  12.                 for(int i=0;i<3;i++)
  13.                 {
  14.                         try
  15.                         {
  16.                                 Thread.sleep(10);
  17.                         }
  18.                         catch (InterruptedException ex)
  19.                         {
  20.                                 ex.getMessage();
  21.                         }
  22.                         print();
  23.                 }
  24. }
  25.         public synchronized void print()
  26.         {
  27.                 a[index] = Thread.currentThread().getName();
  28.                 System.out.println("线程:" +a[index] +"数据被添加");
  29.                 index++;
  30.         }
  31. }
  32. class TreadTestDemo
  33. {
  34.         public static void main(String[] args)
  35.         {
  36.                 ArrayThread myThread = new ArrayThread("线程");
  37.                 Thread t1 = new Thread(myThread);
  38.                 Thread t2 = new Thread(myThread);
  39.                 t1.start();
  40.                 t2.start();

  41.                 try
  42.                 {
  43.                         Thread.sleep(1000);
  44.                 }
  45.                 catch (InterruptedException ex)
  46.                 {
  47.                         ex.getMessage();
  48.                 }
  49.                 System.out.println("打印数组内容:");
  50.                 for(String s : myThread.a)
  51.                 System.out.println(s);
  52.         }
  53. }
复制代码


捕获.PNG (6.66 KB, 下载次数: 225)

捕获.PNG

作者: 当我遇上你    时间: 2015-1-16 09:58
本帖最后由 当我遇上你 于 2015-1-16 10:59 编辑


突然发现个问题,还是改好再来
作者: 张周飞    时间: 2015-1-16 10:24
邓士林 发表于 2015-1-16 00:10

for(String s : myThread.a)
                System.out.println(s);
这段的  :  myThread.a ------对象 . 数组     好像编译不通过吧?能这样写吗?
作者: 邓士林    时间: 2015-1-16 10:38
张周飞 发表于 2015-1-16 10:24
for(String s : myThread.a)
                System.out.println(s);
这段的  :  myThread.a ------对 ...

可以的,这是高级for循环,编译也没问题,因为我事先知道数组是Stirng类型,所以可以直接这样,编译结果:
---------- 编译 ----------
输出完成 (耗时 0 秒) - 正常终止
作者: 当我遇上你    时间: 2015-1-16 13:47
本帖最后由 当我遇上你 于 2015-1-16 13:51 编辑
邓士林 发表于 2015-1-16 00:10

一个线程sleep()另外一个线程一定会抢到CPU执行权吗?应该有例外一个线程执行多次吧,不过通过3来控制应该最多执行3次
作者: 邓士林    时间: 2015-1-16 14:04
当我遇上你 发表于 2015-1-16 13:47
一个线程sleep()另外一个线程一定会抢到CPU执行权吗?应该有例外一个线程执行多次吧,不过通过3来控制应该 ...

不一定会抢到
作者: 当我遇上你    时间: 2015-1-16 14:05
邓士林 发表于 2015-1-16 14:04
不一定会抢到

能做到严格的交替运行么
作者: 邓士林    时间: 2015-1-16 14:48
当我遇上你 发表于 2015-1-16 14:05
能做到严格的交替运行么

刚才回答你的时候已经有个想法,等我忙好这点东西,我去试试,然后在拿出来探讨,你有何高见,指导下
作者: 当我遇上你    时间: 2015-1-16 16:05
邓士林 发表于 2015-1-16 14:48
刚才回答你的时候已经有个想法,等我忙好这点东西,我去试试,然后在拿出来探讨,你有何高见,指导下 ...

设置flag标志,交替判断,尝试失败(丫的还是随机的)。。。。:dizzy:有可能代码有问题,锁理解的不透彻,看你高见学习下
作者: Mr.JUN    时间: 2015-1-26 11:20
我今早面试就做了这个题目~~~~~紧张死了




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