GVKun编程网logo

帮助inotify C脚本(脚本unexpected end of file)

26

本文将介绍帮助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)

帮助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

(三)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.notifyObject.notifyAll方法.换种说法,就是调用Object.wait()和调用Object.wait(0)行为是一致的.
    在调用wait时,必须要有调用对象的锁.而这个锁会一直等待直接这个对象调用notifynotifyAll方法才被释放.这是等待的线程才能重新获取对象的锁而继续执行.

这里需要防止中断或假唤醒线程,所以一般在调用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.notifyAllObject.notify,我自己觉得在可以使用Object.notify的地方,都可以使用Object.notifyAll代替,但是可以使用Object.notifyAll却不能使用Object.notify代替. 在上述的例子,如果只有一个中间人GrilProduct只找一个小红,而且也只有一个花花公子PlayBoy,那么使用Object.notifyObject.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 同步脚本

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

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 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的描述等更多相关知识的信息可以在本站进行查询。

本文标签: