对Java多线程技术中所有方法的详细解析

wangmeiyu1005 2008-07-02 04:37:23
加精

一、run()和start()
这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由Java的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。
二、关键字Synchronized
这个关键字用于保护共享数据,当然前提是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线程访问该 对象时,被Synchronized修饰的数据将被“上锁”,阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。
public ThreadTest implements Runnable

{
public synchronized void run(){
for(int i=0;i<10;i++)
{
System.out.println(" " + i);
}
}
public static void main(String[] args)

{
Runnable r1 = new ThreadTest();
Runnable r2 = new ThreadTest();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}

}

以上这段程序中的 i 变量并不是共享数据,也就是这里的ynchronized关键字并未起作用。因为t1,t2两个线程是两个对象(r1,r2)的线程。不同的对象其数据是不同的,所以r1和r2两个对象的i变量是并不是共享数据。
当把代码改成如下:Synchronized关键字才会起作用

Runnable r = new ThreadTest();

Thread t1 = new Thread(r);

Thread t2 = new Thread(r);

t1.start();

t2.start();


三、sleep()


使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是如果有Synchronized同步块,其他线程仍然不同访问共享数据。注意该方法要捕获异常比如有两个线程同时执行(没有Synchronized),一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完成后,低优先级的线程才能执行;但当高优先级的线程sleep(5000)后,低优先级就有机会执行了。
总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。

四、join()
join()方法使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行。注意该方法也要捕获异常。
五、yield()
它与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。
六、wait()和notify()、notifyAll()
这三个方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用这三个方法。前面说过Synchronized这个关键字用于保护共享数据,阻止其他线程对共享数据的存取。但是这样程序的流程就很不灵活了,如何才能在
当前线程还没退出Synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。
wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等
待池中。当调用 notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。
notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。

注意: 这三个方法都是java.lang.Ojbect的方法!
大家可以参照网站自主学习,JAVA学习视频下载:http://www.javass.cn/


...全文
989 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
1、什么是进程:是指运行中的应用程序,每一个进程都有自己独立的内存空间,一个应用程序可以同时启动多个进程,(静态)比如(IE,JVM)
什么是线程:是指进程中的一个执行流程,有时称之为执行情景,一个进程有多个线程组成(动态)

进程与线程的主要区别:
每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中工作,这些线程可以共享同
一块内存和系统资源

2、线程的启动与创建:
创建线程的两种方式:(1)extends java.lang.Thread
(2)实现Runnable接口
2.1扩展java.lang.Thread
(1)Thread类代表线程类,它主要的两个方法是:
(2)run():包含线程运行时所执行的代码
(3)start():用于启动线程
(4)用户的线程类只需要继承Thread类,override Thread类的run()方法即可。
(5)Thread.currentThread()返回当前正在执行这行代码的线程的引用

3、线程创建的步骤:
(1)自定义线程类继承Thread类
(2)覆盖Thread类中的run()方法
(3)创建线程对象。
(4)调用start()方法启动线程。
第一种
定义线程类实现Runnable接口
Thread myThread = new Thread(target)//target为Runnable接口类型。
Runnable中只有一个方法:
public void run(); 用以定义线程运行体。
使用Runnable接口可以为多个线程提供共享的数据。
在实现Runnable接口的类的run方法定义中可以使用Thread的静态方法:
public static Thread currentThread() 获取当前线程的引用。
第二种
可以定义一个Thread的子类并重写其run方法如:
class MyThread extends Thead {
public void run(){…}
}
然后生成该类的对象:
MyThread myThread=new MyThead(…)


4、线程的实际应用:
(1)主线程与用户自定义线程并发执行。
(2)多个线程共享同一个对象的实例变量
(3)不要随便覆盖Thread类中的start()方法
如果一定要覆盖start()方法,那么就首先调用super.start()方法。
(4)一个线程只能被启动一次


5、实现Runnable接口
(1)Java不允许一个类继承多个类,因此一旦一个类继承了Thread类,就不能再继承其他类。
为了解决这一个问题,Java提供了java.lang.Runnable接口,它有一个run()方法。
public void run();
6、join等待其他线程结束,再去运行其他的线程

7、线程的状态转换
(1)新建状态(new)
(2)就绪状态
(3)运行状态
(4)阻塞状态
(5)死亡状态



同步是指:同步传输是以数据块为传输单位;发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步是指:异步传输是以字符为传输单位;发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

举个例子:
(1)同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。
异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,你也可能等到下班才去吃饭。
(2)打电话时同步 发消息是异步

7、线程实例应用,实现: A 1 2 B 3 4 C 5 6 D............Z 25 26

一、run()和start()
这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由Java的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。
二、关键字Synchronized
这个关键字用于保护共享数据,当然前提是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线程访问该 对象时,被Synchronized修饰的数据将被“上锁”,阻止其他线程访问。当前线程访问完这部分数据后释放锁标志,其他线程就可以访问了。
public ThreadTest implements Runnable

{
public synchronized void run(){
for(int i=0;i <10;i++)
{
System.out.println(" " + i);
}
}
public static void main(String[] args)

{
Runnable r1 = new ThreadTest();
Runnable r2 = new ThreadTest();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}

}

以上这段程序中的 i 变量并不是共享数据,也就是这里的ynchronized关键字并未起作用。因为t1,t2两个线程是两个对象(r1,r2)的线程。不同的对象其数据是不同的,所以r1和r2两个对象的i变量是并不是共享数据。
当把代码改成如下:Synchronized关键字才会起作用

Runnable r = new ThreadTest();

Thread t1 = new Thread(r);

Thread t2 = new Thread(r);

t1.start();

t2.start();


三、sleep()


使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是如果有Synchronized同步块,其他线程仍然不同访问共享数据。注意该方法要捕获异常比如有两个线程同时执行(没有Synchronized),一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的线程执行完成后,低优先级的线程才能执行;但当高优先级的线程sleep(5000)后,低优先级就有机会执行了。
总之,sleep()可以使低优先级的线程得到执行的机会,当然也可以让同优先级、高优先级的线程有执行的机会。

四、join()
join()方法使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行。注意该方法也要捕获异常。
五、yield()
它与sleep()类似,只是不能由用户指定暂停多长时间,并且yield()方法只能让同优先级的线程有执行的机会。
六、wait()和notify()、notifyAll()
这三个方法用于协调多个线程对共享数据的存取,所以必须在Synchronized语句块内使用这三个方法。前面说过Synchronized这个关键字用于保护共享数据,阻止其他线程对共享数据的存取。但是这样程序的流程就很不灵活了,如何才能在
当前线程还没退出Synchronized数据块时让其他线程也有机会访问共享数据呢?此时就用这三个方法来灵活控制。
wait()方法使当前线程暂停执行并释放对象锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象等
待池中。当调用 notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中的线程能够获取锁标志;如果锁标志等待池中没有线程,则notify()不起作用。
notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。




jackwang007 2008-12-18
  • 打赏
  • 举报
回复
回帖是一种美德!传说每天回回帖是回帖是一种美德!传说每天回帖即可获得 10 分可用分一种美德!传说每天回帖即可获得 10 分可用分帖即可获得 10 分可用分
gonxi 2008-08-20
  • 打赏
  • 举报
回复
不错啊,收藏
jellylilg 2008-08-20
  • 打赏
  • 举报
回复
回帖是一种美德!传说每天回回帖是回帖是一种美德!传说每天回帖即可获得 10 分可用分一种美德!传说每天回帖即可获得 10 分可用分帖即可获得 10 分可用分
chopin406 2008-08-05
  • 打赏
  • 举报
回复
正在学习
wjsdxy2006 2008-07-27
  • 打赏
  • 举报
回复
看帖要回帖
yeeshengwei 2008-07-23
  • 打赏
  • 举报
回复
学习........
Guojinguitar 2008-07-07
  • 打赏
  • 举报
回复
fffffffffffffffffffffffffffffffffffffffd
dddddddddddddddddddddddd
ssssssssssssssssssss
eeeeeeeeeeeeeee
sssssssssssssssssssssss
fffffffffffffffffe
[code=C/C++]Windows XP Language Interface Pack
[/code]
k700k700 2008-07-07
  • 打赏
  • 举报
回复
顶一下!!
zhouchangh 2008-07-07
  • 打赏
  • 举报
回复
楼主join()方法能说的更详细些吗?以前学的都忘了
Bestkiller 2008-07-07
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yuppy 的回复:]
拿走了;谢谢;
[/Quote]
yuppy 2008-07-07
  • 打赏
  • 举报
回复
拿走了;谢谢;
jialinniao 2008-07-07
  • 打赏
  • 举报
回复
学习哈
yushenbin 2008-07-07
  • 打赏
  • 举报
回复
学习了
jane2736 2008-07-07
  • 打赏
  • 举报
回复
支持下!!!http://www.jhaccp.com.cn
sunnish8 2008-07-07
  • 打赏
  • 举报
回复
迷茫
Guojinguitar 2008-07-07
  • 打赏
  • 举报
回复
fgfg
Execute ec=new Execute();
Random random = new Random();
char ch[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n'};
char nh[]={'0','1','2','3','4','5','6','7','8','9'};
eishen 2008-07-05
  • 打赏
  • 举报
回复
mark
kavendb 2008-07-05
  • 打赏
  • 举报
回复
还是觉得看在线教程好点~
skysoaringbird 2008-07-05
  • 打赏
  • 举报
回复
good
加载更多回复(8)

2,408

社区成员

发帖
与我相关
我的任务
社区描述
高性能计算
社区管理员
  • 高性能计算社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧