本文将介绍帮助inotifyC脚本的详细情况,特别是关于脚本unexpectedendoffile的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于(
本文将介绍帮助inotify C脚本的详细情况,特别是关于脚本unexpected end of file的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于(三)java多线程之wait notify notifyAll、inotify 同步脚本、inotify-tools|inotifywait、Java notify、notifyAll,wait的描述的知识。
本文目录一览:- 帮助inotify C脚本(脚本unexpected end of file)
- (三)java多线程之wait notify notifyAll
- inotify 同步脚本
- inotify-tools|inotifywait
- Java notify、notifyAll,wait的描述
帮助inotify C脚本(脚本unexpected end of file)
资源
我以前从来没有用过C 此脚本将侦听器添加到目录中,并通过回显到terminal来通知用户,然后在发生文件事件时退出。 我想修改脚本不退出,而是继续监视文件夹。 我认为关键可能是这一行:
length = read( fd,buffer,BUF_LEN );
但我真的不明白这里发生了什么。 read()函数的描述可能对那些熟知C的人有帮助:
在Apache2中浏览子目录的目录
Pythonic的方式来检索区分大小写的path?
Perl:dirhandle的坏符号
我怎样才能从我的文件名使用电源shell删除额外的空白?
通过diff和patch添加完整的目录
Using inotify is simple: Create a file descriptor,attach one or more watches (a watch is a path and set of events),and use the read() method to receive event information from the descriptor. Rather than burn scarce cycles,read() blocks until events occur.
但我不属于这个类别。
目录recursion和符号链接
从C ++的文件名获取完整path
删除文件夹和子文件夹中除最近3个以外的所有文件
创build一个目录,如果它不存在
使用Java的AclFileAttributeView获取通用文件夹权限(如GENERIC_ALL)
程序存在只是因为没有任何东西阻止它exit( 0 ); 一旦发现事件。 你可以包装一切从fd = inotify_init(); to ( void ) close( fd ); 在一个循环中,只要你想要它就会重新开始。
问题不在length = read( fd,BUF_LEN ); 。 这部分只是等待事件发生,并不要求程序退出。 main被设计成在一个运行和退出中执行。
总结
以上是小编为你收集整理的帮助inotify C脚本全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
(三)java多线程之wait notify notifyAll
本人邮箱: <kco1989@qq.com>
欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco
github: https://github.com/kco1989/kco
代码已经全部托管github有需要的同学自行下载
引言
今天我打算讲一下Object.wait
,Object.notify
,Object.notifyAll
这三个方法. 首先我们查看一下api看看,官方api对这几个方法的介绍.
理论
Object.wait()
: 导致当前线程一直等待,直到另一外一个线程用同一个对象调用Object.notify
或Object.notifyAll
方法.换种说法,就是调用Object.wait()
和调用Object.wait(0)
行为是一致的.
在调用wait
时,必须要有调用对象的锁.而这个锁会一直等待直接这个对象调用notify
或notifyAll
方法才被释放.这是等待的线程才能重新获取对象的锁而继续执行.
这里需要防止中断或假唤醒线程,所以一般在调用wait
会使用循环,比如
synchronized (obj) {
while (当条件不满足时)
obj.wait();
... // Perform action appropriate to condition
}
Object.notify
/Object.notifyAll
唤醒一个拥有用到当前对象的锁且在等待的线程.如果有多个等待的线程,则随机唤醒一个.而被唤醒的线程会直到当前线程释放对象的锁后才被执行.被唤醒的线程会使用竞争的方式去获取对象的锁.这些被唤醒的线程都是一视同仁,不会被区别对待.所以每个线程获取对象的锁的几率都是平等的,也是随机的.
总之,在同一个时间点只能有一个线程拥有对象的锁.
上面的解释可能比较官方,出现什么对象的锁
,唤醒
等待之类的时.初学者可能还不能很好的理解.现在我还是用上篇文章的比喻解释一下.
比如现在有一群小明
/''小红''都想进入卧室,卧室的门只有一个,钥匙也只有一把,每次也只能进入一个''小明''和一个小红
.(多了就...)这时候卧室里面如果只有有一个人,那么他/她就只能等待,然后释放卧室门的锁.然后唤醒另外一个她/他进来.进来后把卧室门给锁了,等小明
和小红
谈完人生和理想的时候.再通知其他人,告诉他们房间是空的,可以进来了.这是另外的一群小明
/小红
就会争先恐后的进来.但还是只能进一个小明
和一个小红
.(这里不理解,没有关系,看完文章之后,再回过头看一下这里,说不定就会豁然开朗了.)
这些人比喻就是上面讲到的
线程
,卧室就相当于上面说的对象
,门就相当于上面的锁
,这样一比喻是不是好理解一点.需要注意的是卧室是特定的一个,即每个人等待的卧室都必须是同一个.这样才能用那把钥匙去开门.
编码
如果有些人还不能理解,那么这里我就写一个程序再来解析一下.就用上面的比喻做例子吧.ok,开始编码.
首先,我们要先定一个抽象卧室类
Room
,这个类需要用成员变量gril
,还必须提供两个方法makeGridInRoom(String gril)
和playWithGril(String boy)
,这个类的实现我们暂时先放放,后面再说之后,我们要创建中间人来一个找小妞的类,
GrilProduct
,把卧室room
传进来,然后依此找到十个小妞进入卧室里.
public class GrilProduct implements Runnable{
private Room room;
public GrilProduct(Room room) {
this.room = room;
}
@Override
public void run() {
for (int i = 0; i < 10; i ++){
room.makeGridInRoom("小红" + i + "号");
}
}
}
然后,我们还需要有一个花花公子类,来和小妞谈谈人生,说说理想,
PlayBoy
public class PlayBoy implements Runnable{
private Room room;
private String boy;
public PlayBoy(Room room, String boy) {
this.room = room;
this.boy = boy;
}
@Override
public void run() {
room.playWithGril(boy);
}
}
最后,我们要让那个中间人活动起来,而且需要来依此十个花花公子来和小妞谈人生,谈理想.毕竟小妞一个人也只能应付一个花花公子,加班是很累的.
TestMain
public class TestMain {
public static void main(String[] args) {
Room room1 = new Room1();
playGameInRoom(room1);
// Room room2 = new Room2();
// playGameInRoom(room2);
//
// Room room3 = new Room3();
// playGameInRoom(room3);
//
// Room room4 = new Room4();
// playGameInRoom(room4);
}
public static void playGameInRoom(Room room){
Thread grilProduct = new Thread(new GrilProduct(room));
Set<Thread> boyThread = new HashSet<>();
for (int i = 0; i < 10; i ++){
boyThread.add(new Thread(new PlayBoy(room, "小明" + i + "号")));
}
grilProduct.start();
for (Thread boy : boyThread){
boy.start();
}
}
}
行了,现在开始来考虑Room
要怎么写.
第一个想法,比较简单,小妞来了就来了,花花公子来了就开始谈人生,谈理想.编写
Room1
继承Room
public class Room1 extends Room{
private String gril;
@Override
public synchronized void makeGridInRoom(String gril){
this.gril = gril;
}
@Override
public synchronized void playWithGril(String boy){
System.out.println(boy + " play with " + this.gril);
this.gril = null;
}
}
运行一下结果:
小明1号 play with 小红9号
小明3号 play with null
小明6号 play with null
小明0号 play with null
小明8号 play with null
小明5号 play with null
小明7号 play with null
小明2号 play with null
小明4号 play with null
小明9号 play with null
我靠,怎么只有小明1号
和小红9号
聊上了,其他公子自己玩. 哦,原来是小红9号
把前面几个给挤掉了,其他小明
,小红
不服了,凭什么小红9号
那么霸气.行,为了满足大家,继续改..
第二个想法,如果花花公子来了,但小妞不在卧室,那么公子就会离开;另外如果一个小妞发现卧室有人,她也选择离开.
public class Room2 extends Room{
@Override
public synchronized void makeGridInRoom(String gril){
if (this.gril != null){
return;
}
this.gril = gril;
}
@Override
public synchronized void playWithGril(String boy){
if (this.gril == null){
return;
}
System.out.println(boy + " play with " + this.gril);
this.gril = null;
}
}
运行结果是
小明1号 play with 小红0号
而且每次运行结果都不一样,这时候其他人不爽了,为什么我进入的时候没人呢?
这里我们需要改变一下策略.如果卧室没人.那么让他们就睡一下,等待其他人来谈完人生再走.
public class Room3 extends Room{
@Override
public synchronized void makeGridInRoom(String gril){
while (this.gril != null){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.gril = gril;
}
@Override
public synchronized void playWithGril(String boy){
while (this.gril == null){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(boy + " play with " + this.gril);
this.gril = null;
}
}
运行结果.我靠,卧室被锁了,而且只有一个人一直在里面孤零零的等着,永远等不到另外一个人来.悲剧了.....
不行,我们还是要改变一下策略.如果花花公子发现卧室里没有小妞,那就先等着.等待小妞来了,让她来叫醒我.小妞也是一样,如果卧室里已经有小妞了,那么就先等着,等他们谈完人生,谈完理想再来叫醒我.
public class Room4 extends Room{
@Override
public synchronized void makeGridInRoom(String gril){
while (this.gril != null){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.notifyAll();
this.gril = gril;
}
@Override
public synchronized void playWithGril(String boy){
while (this.gril == null){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(boy + " play with " + this.gril);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.notifyAll();
this.gril = null;
}
}
运行结果:
小明9号 play with 小红0号
小明1号 play with 小红1号
小明4号 play with 小红2号
小明3号 play with 小红3号
小明2号 play with 小红4号
小明6号 play with 小红5号
小明7号 play with 小红6号
小明0号 play with 小红7号
小明5号 play with 小红8号
小明8号 play with 小红9号
谢天谢地啊,每个小明
都找到小红
了,我再也不用担心被小明
/小红
在k死了.
后记
在最后两种做法,一种是调用
Thread.sleep
,一种是调用Object.wait
.两种都是是线程睡眠等待,但为什么结果不一样呢?这里解释一下,Thread.sleep
会释放资源,但是不会释放锁,所以如果有人进入卧室,就一直霸占这这个卧室,其他压根都进不来.但Object.wait
除了会释放资源之外,还会释放锁.等到小红
/小明
进入卧室,在通知小明
/小红
进入卧室.还有使用
Object.notifyAll
和Object.notify
,我自己觉得在可以使用Object.notify
的地方,都可以使用Object.notifyAll
代替,但是可以使用Object.notifyAll
却不能使用Object.notify
代替. 在上述的例子,如果只有一个中间人GrilProduct
只找一个小红
,而且也只有一个花花公子PlayBoy
,那么使用Object.notify
和Object.notifyAll
都一样,但是如果有多个花花公子,就必须使用Object.notifyAll
去唤醒所有人,让其中一个人跑进卧室里.其他人进不去,就继续等待.然后继续全部唤醒,继续等待....Object.wait()
和Object.wait(long)
的区别,wait()
是进入卧室之后就一直等,直到被唤醒,wait(long)
则是进入卧室之后一直等或者到了指定时间内被唤醒
对上面的例子改写一下,在GrilProduct
改为每500ms才找到一个小红
public class GrilProduct implements Runnable{
private Room room;
public GrilProduct(Room room) {
this.room = room;
}
@Override
public void run() {
for (int i = 0; i < 10; i ++){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
room.makeGridInRoom("小红" + i + "号");
}
}
}
然后对Room4.playWithGril
改为
@Override
public synchronized void playWithGril(String boy){
while (this.gril == null){
try {
System.out.println(boy + " 我的心在等待,永远在等待...");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(boy + " play with " + this.gril);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.notifyAll();
this.gril = null;
}
运行一下
小明1号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明9号 play with 小红0号
小明4号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明1号 我的心在等待,永远在等待...
小明1号 play with 小红1号
小明6号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明4号 play with 小红2号
小明2号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明6号 play with 小红3号
小明3号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明2号 play with 小红4号
小明7号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明3号 play with 小红5号
小明5号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明7号 play with 小红6号
小明8号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明5号 play with 小红7号
小明0号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明8号 play with 小红8号
小明0号 我的心在等待,永远在等待...
小明0号 play with 小红9号
然后在对Room4.playWithGril
改写为
@Override
public synchronized void playWithGril(String boy){
while (this.gril == null){
try {
System.out.println(boy + " 我的心在等待,永远在等待...");
this.wait(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(boy + " play with " + this.gril);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.notifyAll();
this.gril = null;
}
然后再运行一下
小明3号 我的心在等待,永远在等待...
小明1号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明1号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明1号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明1号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明1号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明1号 我的心在等待,永远在等待...
小明1号 play with 小红0号
小明7号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明3号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明3号 play with 小红1号
小明6号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明4号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明4号 play with 小红2号
小明8号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明8号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明8号 play with 小红3号
小明5号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明6号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明6号 play with 小红4号
小明2号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明7号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明7号 play with 小红5号
小明0号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明0号 我的心在等待,永远在等待...
小明0号 play with 小红6号
小明5号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明5号 我的心在等待,永远在等待...
小明5号 play with 小红7号
小明2号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明9号 我的心在等待,永远在等待...
小明9号 play with 小红8号
小明2号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明2号 我的心在等待,永远在等待...
小明2号 play with 小红9号
最后,聪明的读者就自己对比一下,两份输出有什么不一样的地方,就可以搞定wait()
和wait(long)
的区别,这时也应该能明白为什么wait
方法的调用要写在while
循环里面了.
打赏
如果觉得我的文章写的还过得去的话,有钱就捧个钱场,没钱给我捧个人场(帮我点赞或推荐一下)
inotify 同步脚本
#!/bin/bash
path1=/home/htoa/tomcat/webapps/ROOT/htoa/
ip=192.168.30.13
/usr/bin/inotifywait -mrq --timefmt %y/%m''%d %H:/%M'' --format ''%T %w%f'' -emodify,delete,create,attrib $path1 | while read file;
do
rsync -avz --delete --progress --exclude-from="/usr/local/src/scripts/exclude.list" $path1 root@$ip:$path1
echo "${file} was rsynced" >> /var/log/rsync.log 2>&1
done
inotify-tools|inotifywait
#! /bin/basha
INOTIYF_BIN_ROOT=''/root/inotify-tools/src/inotifywait''
INOTIFY_EVENT_MODE=''modify,create,delete''
INOTIFY_BACKUP_DIR=''/root/bomfile''
INOTIFY_FORMAT=''%e@%w%f''
INOTIFY_EXCLUDE=''(.*/*\.swp)''
INOTIFY_OUTFILE=''/root/log.log''
function inotify_start() {
${INOTIYF_BIN_ROOT} -m -r -q --format ${INOTIFY_FORMAT} --exclude ${INOTIFY_EXCLUDE} -e ${INOTIFY_EVENT_MODE} ${INOTIFY_BACKUP_DIR} | while read listener
do
INFO_EVENT=$(echo $listener | cut -d ''@'' -f 1)
INFO_FILE=$(echo $listener | cut -d ''@'' -f 2)
echo $INFO_EVENT
if [ $INFO_EVENT == ''CREATE'' ] || [ $INFO_EVENT == ''MODIFY'' ] || [ $INFO_EVENT == ''CREATE,ISDIR'' ]
then
echo $INFO_EVENT ''============='' $INFO_FILE
fi
if [ $INFO_EVENT == ''DELETE'' ] || [ $INFO_EVENT == ''DELETE,ISDIR'' ]
then
echo $INFO_EVENT ''ddddddddddddddddddddddddddd'' $INFO_FILE
fi
done
}
case "$1" in
start)
inotify_start
;;
stop)
echo ''stop''
;;
*)
echo ''none''
esac
inotifywait -m 是监视器, -d 是后台运行,后台运行时需要 --outfile 指定
Java notify、notifyAll,wait的描述
在多线程的情况下,由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。
wait与notify是java同步机制中重要的组成部分。结合与synchronized关键字使用,可以建立很多优秀的同步模型。
synchronized(this){ }等价于publicsynchronized void method(){.....}
同步分为类级别和对象级别,分别对应着类锁和对象锁。类锁是每个类只有一个,如果static的方法被synchronized关键字修饰,则在这个方法被执行前必须获得类锁;对象锁类同。
首先,调用一个Object的wait与notify/notifyAll的时候,必须保证调用代码对该Object是同步的,也就是说必须在作用等同于synchronized(obj){......}的内部才能够去调用obj的wait与notify/notifyAll三个方法,否则就会报错:
java.lang.IllegalMonitorStateException:current thread not owner
在调用wait的时候,线程自动释放其占有的对象锁,同时不会去申请对象锁。当线程被唤醒的时候,它才再次获得了去获得对象锁的权利。
所以,notify与notifyAll没有太多的区别,只是notify仅唤醒一个线程并允许它去获得锁,notifyAll是唤醒所有等待这个对象的线程并允许它们去获得对象锁,只要是在synchronied块中的代码,没有对象锁是寸步难行的。其实唤醒一个线程就是重新允许这个线程去获得对象锁并向下运行。
notifyAll,虽然是对每个wait的对象都调用一次notify,但是这个还是有顺序的,每个对象都保存这一个等待对象链,调用的顺序就是这个链的顺序。其实启动等待对象链中各个线程的也是一个线程,在具体应用的时候,需要注意一下。
wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能。因为都个对像都有锁,锁是每个对像的基础,当然操作锁的方法也是最基础了。
wait():
等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则编译可以通过,但运行时会收到一个异常:IllegalMonitorStateException。
调用任意对象的 wait() 方法导致该线程阻塞,该线程不可继续执行,并且该对象上的锁被释放。
notify():
唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。
调用任意对象的notify()方法则导致因调用该对象的 wait()方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。
notifyAll():
唤醒所有等待的线程,注意唤醒的是notify之前wait的线程,对于notify之后的wait线程是没有效果的。
通常,多线程之间需要协调工作:如果条件不满足,则等待;当条件满足时,等待该条件的线程将被唤醒。在Java中,这个机制的实现依赖于wait/notify。等待机制与锁机制是密切关联的。
例如:
synchronized(obj) {
while(!condition) {
obj.wait();
}
obj.doSomething();
}
当线程A获得了obj锁后,发现条件condition不满足,无法继续下一处理,于是线程A就wait()。
在另一线程B中,如果B更改了某些条件,使得线程A的condition条件满足了,就可以唤醒线程A :
synchronized(obj) {
condition = true;
obj.notify();
}
需要注意的概念是:
# 调用obj的wait(), notify()方法前,必须获得obj锁,也就是必须写在synchronized(obj){...} 代码段内。
# 调用obj.wait()后,线程A就释放了obj的锁,否则线程B无法获得obj锁,也就无法在synchronized(obj){...} 代码段内唤醒A。
# 当obj.wait()方法返回后,线程A需要再次获得obj锁,才能继续执行。
#如果A1,A2,A3都在obj.wait(),则B调用obj.notify()只能唤醒A1,A2,A3中的一个(具体哪一个由JVM决定)。
#obj.notifyAll()则能全部唤醒A1,A2,A3,但是要继续执行obj.wait()的下一条语句,必须获得obj锁,因此,A1,A2,A3只有一个有机会获得锁继续执行,例如A1,其余的需要等待A1释放obj锁之后才能继续执行。
# 当B调用obj.notify/notifyAll的时候,B正持有obj锁,因此,A1,A2,A3虽被唤醒,但是仍无法获得obj锁。直到B退出synchronized块,释放obj锁后,A1,A2,A3中的一个才有机会获得锁继续执行。
谈一下synchronized和wait()、notify()等的关系:
1.有synchronized的地方不一定有wait,notify
2.有wait,notify的地方必有synchronized.这是因为wait和notify不是属于线程类,而是每一个对象都具有的方法,而且,这两个方法都和对象锁有关,有锁的地方,必有synchronized。
另外,注意一点:如果要把notify和wait方法放在一起用的话,必须先调用notify后调用wait,因为如果调用完wait,该线程就已经不是currentthread了。
本文转自http://blog.csdn.net/oracle_microsoft/article/details/6863662
今天关于帮助inotify C脚本和脚本unexpected end of file的介绍到此结束,谢谢您的阅读,有关(三)java多线程之wait notify notifyAll、inotify 同步脚本、inotify-tools|inotifywait、Java notify、notifyAll,wait的描述等更多相关知识的信息可以在本站进行查询。
本文标签: