葡京在线开户JAVA二十四线程之wait/notify

本文主要学习JAVA三十二线程中的 wait()方法 与
notify()/notifyAll()方法的用法。

  简介

①wait() 与 notify/notifyAll 方法必须在一块儿代码块中行使

  OWA服务,约等于Office Web
Application,微软提供的可以在线查看和编排Office种类文档的劳务,包罗Word/Excel/PPT/OneNote。大家得以因此OWA服务和SharePoint集成,在线查看和编制SharePoint站点文档库中的Office文档。

②wait() 与  notify/notifyAll() 的实施进程

  而本文,主要就是介绍如何设置和安顿OWA,并且,介绍其大概会遇到的片段题目。

③中断 调用wait()方法进入等待队列的 线程

  服务器架设

④notify 通告的相继无法错

葡京在线开户 1

⑤八线程中测试某个条件的浮动用 if 依旧用 while?

  设置进度

 

葡京在线开户 2

①wait() 与 notify/notifyAll 方法必须在一齐代码块中利用

  设置服务器环境

wait() 与 notify/notifyAll()
是Object类的章程,在推行八个办法时,要先取得锁。那么怎么得到锁吧?

  安装服务器是比较不难的,大家只需求创设虚拟机,然后安装服务器操作系统就可以了,唯一需求专注的就是服务器操作系统版本的挑选,还有服务器的连带配置。

在这篇:JAVA八线程之Synchronized关键字–对象锁的性状小说中牵线了选用synchronized关键字拿到锁。因而,wait()
与  notify/notifyAll()
平时与synchronized搭配使用,即在synchronized修饰的联合代码块或艺术里面调用wait()
与  notify/notifyAll()方法。

  我们那边设置的SharePoint Server 2013版本,所以服务器接纳的是Windows
Server 2012 R2,数据库拔取的是SQL Server 2012 with
SP1,要是我们想拔取其他版本的操作系统或许数据库,记得先去查看SharePoint
Server 2013的软件和硬件要求

 

  安装服务器环境今后,记得修改机器名为见名知意的机械名(非必需),那样便于大家今后访问和维护,同时,提议修改IP地址为静态IP,若是是DHCP的话,只怕重启未来IP地址会动态变化,那样不便民前面的利用。

②wait() 与  notify/notifyAll() 的实践进程

  接下去就是设置SQL
Server数据库,数据库的安装是相比较简单的,那里没有啥特别要表达的。

鉴于 wait() 与  notify/notifyAll()
是身处一起代码块中的,为此线程在举行它们时,肯定是进入了临界区中的,即该线程肯定是得到了锁的。

  再然后是SharePoint准备工具和SharePoint Server
2013的装置,准备工具里Windows Server
AppFabric必要利用命令举办安装,SharePoint的设置只须求一步步安装和配置就可以了(具体可以参照我的SharePoint
2013
设置图解)。

当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态。

  最终,就是OWA 2013的设置和安排。

 当执行notify/notifyAll方法时,会指示一个处在等候该
对象锁
的线程,然后继续往下实施,直到执行完退出对象锁锁住的区域(synchronized修饰的代码块)后再自由锁。

  OWA安装介绍

从那边可以看看,notify/notifyAll()执行后,并不及时释放锁,而是要等到实施完临界区中代码后,再自由。故,在实际上编程中,大家理应尽或者在线程调用notify/notifyAll()后,登时退出临界区。即不用在notify/notifyAll()前边再写一些耗时的代码。示例如下:

  安装IIS和Net framework 3.5

 1 public class Service {
 2 
 3     public void testMethod(Object lock) {
 4         try {
 5             synchronized (lock) {
 6                 System.out.println("begin wait() ThreadName="
 7                         + Thread.currentThread().getName());
 8                 lock.wait();
 9                 System.out.println("  end wait() ThreadName="
10                         + Thread.currentThread().getName());
11             }
12         } catch (InterruptedException e) {
13             e.printStackTrace();
14         }
15     }
16 
17     public void synNotifyMethod(Object lock) {
18         try {
19             synchronized (lock) {
20                 System.out.println("begin notify() ThreadName="
21                         + Thread.currentThread().getName() + " time="
22                         + System.currentTimeMillis());
23                 lock.notify();
24                 Thread.sleep(5000);
25                 System.out.println("  end notify() ThreadName="
26                         + Thread.currentThread().getName() + " time="
27                         + System.currentTimeMillis());
28             }
29         } catch (InterruptedException e) {
30             e.printStackTrace();
31         }
32     }
33 }

  安装角色和劳动

在第3行的testMethod()中调用 wait(),在第17行的synNotifyMethod()中调用notify()

Add-WindowsFeature Web-Server,Web-Mgmt-Tools,Web-Mgmt-Console,Web-WebServer,Web-Common-Http,Web-Default-Doc,Web-Static-Content,Web-Performance,Web-Stat-Compression,Web-Dyn-Compression,Web-Security,Web-Filtering,Web-Windows-Auth,Web-App-Dev,Web-Net-Ext45,Web-Asp-Net45,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Includes,InkandHandwritingServices,NET-Framework-Features,NET-Framework-Core,NET-HTTP-Activation,NET-Non-HTTP-Activ,NET-WCF-HTTP-Activation45

从上面的代码可以看来,wait() 与 
notify/notifyAll()皆以放在一起代码块中才可以履行的。若是在执行wait() 与 
notify/notifyAll()
从前没有赢得对应的靶子锁,就会抛出:java.lang.IllegalMonitorStateException分外。

  安装 Office Web Apps Server

在第8行,当ThreadA线程执行lock.wait();那条语句时,释放得到的目标锁lock,并放任CPU,进入等待队列。

  安装 Office Web Apps Server 和相关革新(可选)

当另一个线程执行第23行lock.notify();,会唤醒ThreadA,只是此时它并不登时释放锁,接下去它睡眠了5分钟(sleep()是不释放锁的,事实上sleep()也足以不在同步代码块中调用),直到第28行,退出synchronized修饰的临界区时,才会把锁释放。那时,ThreadA就有空子收获另一个线程释放的锁,并从等待的地点起(第9行)初叶阶实施。

  为 Office Web Apps Server 安装语言包(可选)

 

  创制 Office Web Apps Server 服务器场

接下去是八个线程类,线程类ThreadA调用testMethod()方法执行lock.wait();时被挂起,另一个线程类synNotifyMethodThread调用synNotifyMethod()负责唤醒挂起的线程。代码如下:

New-OfficeWebAppsFarm -InternalURL "http://servername" -AllowHttp -EditingEnabled
 1 public class ThreadA extends Thread {
 2     private Object lock;
 3 
 4     public ThreadA(Object lock) {
 5         super();
 6         this.lock = lock;
 7     }
 8 
 9     @Override
10     public void run() {
11         Service service = new Service();
12         service.testMethod(lock);
13     }
14 }
15 
16 public class SynNotifyMethodThread extends Thread {
17     private Object lock;
18 
19     public SynNotifyMethodThread(Object lock) {
20         super();
21         this.lock = lock;
22     }
23 
24     @Override
25     public void run() {
26         Service service = new Service();
27         service.synNotifyMethod(lock);
28     }
29 }

  验证是不是中标创立了 Office Web Apps Server 服务器场

 

  http://servername/hosting/discovery

再接下去是测试类:

  配置OWA和SharePoint集成

 1 public class Test {
 2 
 3     public static void main(String[] args) throws InterruptedException {
 4 
 5         Object lock = new Object();
 6 
 7         ThreadA a = new ThreadA(lock);
 8         a.start();
 9 
10         //NotifyThread notifyThread = new NotifyThread(lock);
11        // notifyThread.start();
12 
13         SynNotifyMethodThread c = new SynNotifyMethodThread(lock);
14         c.start();
15     }
16 }

  成立 SharePoint 2013 和 Office Web Apps Server 之间的绑定

 

New-SPWOPIBinding -ServerName <WacServerName> -AllowHTTP

③中断 调用wait()方法进入等待队列的 线程

  查看针对 SharePoint 绑定的 WOPI 区域

演示代码如下:

Get-SPWOPIZone
 1 public class Service {
 2 
 3     public void testMethod(Object lock) {
 4         try {
 5             synchronized (lock) {
 6                 System.out.println("begin wait()");
 7                 lock.wait();
 8                 System.out.println("  end wait()");
 9             }
10         } catch (InterruptedException e) {
11             e.printStackTrace();
12             System.out.println("出现异常");
13         }
14     }
15 }
16 
17 public class ThreadA extends Thread {
18 
19     private Object lock;
20 
21     public ThreadA(Object lock) {
22         super();
23         this.lock = lock;
24     }
25 
26     @Override
27     public void run() {
28         Service service = new Service();
29         service.testMethod(lock);
30     }
31 }

  将 WOPI 区域改变为 internal-http

留意,在第23行wait()方法是Object类的目的lock调用的。而上边的interrupt()方法是ThreadA类的靶子调用的。在ThreadA里面,将Object的对象作为参数传给了testMethod()方法,ThreadA的run()方法去调用testMethod(),从而wait()使ThreadA的线程暂停了(暂停当前履行wait()的线程)。从此处可以看到一个界别:

Set-SPWOPIZone -zone "internal-http"

Object类中与线程有关的格局:

  将 SharePoint 2013 中的 AllowOAuthOverHttp 设置更改为 True

1)notify/notifyAll

(Get-SPSecurityTokenServiceConfig).AllowOAuthOverHttp

2)wait()/wait(long)

  假诺此命令归来 False,则运行下列命令可将其设置为 True。

java.lang.Thread中与之相关的方法:

$config = (Get-SPSecurityTokenServiceConfig)

$config.AllowOAuthOverHttp = $true

$config.Update()

1)interrupt()

  再一次运行以下命令来验证 AllowOAuthOverHttp 设置以后是或不是设置为 True。

2)sleep()/sleep(long)

(Get-SPSecurityTokenServiceConfig).AllowOAuthOverHttp

3)join()/suspend()/resume()….

  验证 Office Web Apps 是不是健康运行

测试类代码如下:

  附录

 1 public class Test {
 2 
 3     public static void main(String[] args) {
 4 
 5         try {
 6             Object lock = new Object();
 7 
 8             ThreadA a = new ThreadA(lock);
 9             a.start();
10 
11             Thread.sleep(5000);
12 
13             a.interrupt();
14         } catch (InterruptedException e) {
15             e.printStackTrace();
16         }
17     }
18 }

  SharePoint 2013 的硬件和软件须要

当执行第13行的interrupt()时,处于wait中的线程“立时”被唤醒(一般是即时响应中断请求),并抛出极度。此时,线程也就得了了。

  https://technet.microsoft.com/library/a88d3f72-7ac3-4f08-b302-c4ca0a796268(v=office.16).aspx.aspx)

 

  SharePoint 2013 安装图解

④notify 布告的一一不可以错

  https://www.cnblogs.com/jianyus/archive/2013/02/01/2889653.html

如果在线程A中推行wait(),在线程B中履行notify()。但假使线程B先举办了notify()然后甘休了,线程A才去实践wait(),那此时,线程A将不可以被正常指示了(还足以由此③中涉及的interrupt()方法以抛出万分的法子指示^~^)。

  部署 Office Web Apps Server

那篇文章:
JAVA三多线程之线程间的通讯格局
中的第③点提到了notify通告顺序出错会促成
调用wait()进入等待队列的线程再也无所适从被提示了。

  https://technet.microsoft.com/zh-cn/library/jj219455.aspx

 

  为 SharePoint 2013 配置 Office Web Apps

⑤三十二线程中测试某个条件的更动用 if 如故用 while?

  https://technet.microsoft.com/zh-cn/library/ff431687.aspx

原先一贯不明了
当在线程的run()方法中必要测试某个条件时,为啥用while,而不用if???直到看到了这几个不难的例子,终于了解了。。。。

  完整摄像安装教程

本条例子是那样的:

  http://edu.csdn.net/course/detail/6724

有三个线程从List中剔除数据,而只有一个线程向List中添加多少。初叶时,List为空,只有往List中添加了多少将来,才能去除List中的数据。添加数据的线程向List添加完数据后,调用notifyAll(),唤醒了三个删除线程,可是它只添加了一个数量,而明日有三个指示的去除线程,那时如何是好??

假若用 if
测试List中的数据的个数,则会现出IndexOutofBoundException
,越界卓殊。原因是,List中唯有一个数额,第四个删除线程把数量删除后,第三个线程再去实施删除操作时,删除退步,从而抛出
IndexOutofBoundException。

然则借使用while
测试List中数据的个数,则不见面世越界很是
!!!神奇。

当wait等待的准绳爆发变化时,会促成程序的逻辑混乱—即,List中一向不多少了,再或许有线程去实践删除数据的操作。由此,须求用while循环来判断标准的转移,而不是用if。

示范如下:Add类,负责添加数据:

public class Add {

    private String lock;
    public Add(String lock) {
        super();
        this.lock = lock;
    }

    public void add() {
        synchronized (lock) {
            ValueObject.list.add("anyString");
            lock.notifyAll();
        }
    }
}

public class ThreadAdd extends Thread {

    private Add p;

    public ThreadAdd(Add p) {
        super();
        this.p = p;
    }

    @Override
    public void run() {
        p.add();
    }
}

 

Subtract类,负责删除数据—-先要进行标准化判断,然后实施wait(),那表示:wait等待的条件只怕发生变化!!!

public class Subtract {

    private String lock;

    public Subtract(String lock) {
        super();
        this.lock = lock;
    }

    public void subtract() {
        try {
            synchronized (lock) {
                if(ValueObject.list.size() == 0) {//将这里的if改成while即可保证不出现越界异常!!!!
                    System.out.println("wait begin ThreadName="
                            + Thread.currentThread().getName());
                    lock.wait();
                    System.out.println("wait   end ThreadName="
                            + Thread.currentThread().getName());
                }
                ValueObject.list.remove(0);
                System.out.println("list size=" + ValueObject.list.size());
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class ThreadSubtract extends Thread {

    private Subtract r;

    public ThreadSubtract(Subtract r) {
        super();
        this.r = r;
    }

    @Override
    public void run() {
        r.subtract();
    }
}

 

封装的List队列:

public class ValueObject {

    public static List list = new ArrayList();

}

 

测试类:

public class Run {

    public static void main(String[] args) throws InterruptedException {

        String lock = new String("");

        Add add = new Add(lock);
        Subtract subtract = new Subtract(lock);

        ThreadSubtract subtract1Thread = new ThreadSubtract(subtract);
        subtract1Thread.setName("subtract1Thread");
        subtract1Thread.start();

        ThreadSubtract subtract2Thread = new ThreadSubtract(subtract);
        subtract2Thread.setName("subtract2Thread");
        subtract2Thread.start();

        Thread.sleep(1000);

        ThreadAdd addThread = new ThreadAdd(add);
        addThread.setName("addThread");
        addThread.start();

    }
}

 

参照:《JAVA十二线程主题技术》

原文:http://www.cnblogs.com/hapjin/p/5492645.html