黑马程序员技术交流社区
标题:
关于线程的两种创建方式
[打印本页]
作者:
潘东升
时间:
2012-5-16 10:32
标题:
关于线程的两种创建方式
//以下思路是重新复习毕老师多线程视频教程时的一些疑惑,求解啊,哈哈
/*
思路: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!");
}
}
作者:
崔陈喜
时间:
2012-5-16 11:12
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 13:14
崔陈喜 发表于 2012-5-16 11:12
1.继承Thread类
定义类继承Thread, 重写run()方法, 将线程中要执行的代码写在run()方法中
创建该类对象 ...
呵呵,谢谢,不过答非所问
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2