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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 潘东升 中级黑马   /  2012-5-16 10:32  /  1760 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//以下思路是重新复习毕老师多线程视频教程时的一些疑惑,求解啊,哈哈
/*
思路:1、有数据被多线程共享,即多线程使用同一个对象,则是对象作为了参数传入多个Thread对象的构造函数中实现的
   2、查阅API文档发现可以将Runnable对象作为参数传入Thread类的构造函数中,实现让新开启的线程运行Runnable对象
   3、而Runnable类是接口,无法创建对象,必须通过其子类创建对象
   4、所以定义一个类实现Runnable接口,可以创建该类对象并作为参数传入Thread类的构造函数中进行该Thread对象的初始化,
   即创建了新线程并该线程中有指定的代码块,而Runnable子类对象可以传入不同的Thread对象中,
  即实现了多个线程同时执行Runnable子类对象
  也就是多个线程共享一个对象,该对象的数据被多个线程共享
   疑问1;
   设计该(Runnable)接口的目的是为希望在活动时执行代码的对象提供一个公共协议----摘自API
  这里有疑问,即按照上面自己的思路,我认为的目的是多个线程共用指定代码块,提高效率。还有它提供了什么协议?
   疑问2:
   大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。
  这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类创建子类。----摘自API
  这里的疑问是,实现和继承这两种创建线程方式的区别,实现方式,避免了继承的局限性,
  java中只支持单继承而可以多实现,所以用实现方式创建线程,我认为是为了提高可扩展性,
  而不是简单的“只想重写 run() 方法,而不重写其他 Thread 方法”,况且其他Thread方法也不需要重写

*/
class Ticket implements Runnable
{
private int ticket = 200;
Object obj = new Object();
public void run()
{
  while (true)
  {
   synchronized(obj)
   {
    if(ticket>0)
     System.out.println(this.toString()+"剩余票数"+(--ticket));
   }
  }
}
}
class  ThreadDemo
{
public static void main(String[] args)
{
  Ticket t = new Ticket();
  Thread th1 = new Thread(t);
  Thread th2 = new Thread(t);
  Thread th3 = new Thread(t);
  Thread th4 = new Thread(t);
  th1.start();
  th2.start();
  th3.start();
  th4.start();
  System.out.println("Hello World!");
}
}

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
1.继承Thread类
                定义类继承Thread, 重写run()方法, 将线程中要执行的代码写在run()方法中
                创建该类对象, 调用start()方法就可以开启一条新线程, 新线程中自动指定run()方法
        2.实现Runnable接口
                定义类实现Runnable接口, 重写run()方法, 将线程中要执行的代码写在run()方法中
                创建该类对象, 创建Thread类对象, 将Runnable对象传入Thread的构造函数中
                调用Thread对象的start()方法就可以开启一条新线程, 新线程中执行Runnable的run()方法

通信
        1.为什么要通信
                多线程并发执行的时候, 如果需要指定线程等待或者唤醒指定线程, 那么就需要通信.
        2.怎么通信
                在同步代码块中, 使用锁对象的wait()方法可以让当前线程等待, 直到有其他线程唤醒为止.
                在同步代码块中, 使用锁对象的notify()方法可以唤醒一个等待的线程.
回复 使用道具 举报
崔陈喜 发表于 2012-5-16 11:12
1.继承Thread类
                定义类继承Thread, 重写run()方法, 将线程中要执行的代码写在run()方法中
                创建该类对象 ...

呵呵,谢谢,不过答非所问
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马