加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java多线程基础(二)

发布时间:2020-12-14 06:33:49 所属栏目:Java 来源:网络整理
导读:} span style="color: #0000ff;"public span style="color: #0000ff;"class span style="color: #000000;" ThreadDemo1 { /spanspan style="color: #0000ff;"gt;public/span span style="color: #0000ff;"gt;static/span span style="color: #0000ff;"gt;voi

}

  

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> ThreadDemo1 {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;创建共享资源对象</span>
    TicketRes ticketRes=<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; TicketRes();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;创建线程对象</span>
    Thread w1=<span style="color: #0000ff;"&gt;new</span> Thread(ticketRes,"窗口1"<span style="color: #000000;"&gt;);
    Thread w2</span>=<span style="color: #0000ff;"&gt;new</span> Thread(ticketRes,"窗口2"<span style="color: #000000;"&gt;);
    Thread w3</span>=<span style="color: #0000ff;"&gt;new</span> Thread(ticketRes,"窗口3"<span style="color: #000000;"&gt;);
    w1.start();
    w2.start();
    w3.start();
}

}
<span style="color: #008000;">//<span style="color: #008000;">共享资源类
<span style="color: #0000ff;">class TicketRes <span style="color: #0000ff;">implements<span style="color: #000000;"> Runnable{
<span style="color: #0000ff;">private <span style="color: #0000ff;">int ticket=100<span style="color: #000000;">;
<span style="color: #0000ff;">private Object lock=<span style="color: #0000ff;">new Object();<span style="color: #008000;">//<span style="color: #008000;">锁
<span style="color: #000000;">
@Override
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> run() {
<span style="color: #008000;">//<span style="color: #008000;"> TODO Auto-generated method stub
<span style="color: #0000ff;">while(<span style="color: #0000ff;">true<span style="color: #000000;">) {
<span style="color: #0000ff;">synchronized<span style="color: #000000;"> (lock) {
<span style="color: #0000ff;">if(ticket>=1<span style="color: #000000;">) {
<span style="color: #0000ff;">try<span style="color: #000000;"> {
Thread.sleep(10<span style="color: #000000;">);
} <span style="color: #0000ff;">catch<span style="color: #000000;"> (InterruptedException e) {
<span style="color: #008000;">//<span style="color: #008000;"> TODO Auto-generated catch block
<span style="color: #000000;"> e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖第"+ticket+"张票"<span style="color: #000000;">);
ticket--<span style="color: #000000;">;
}<span style="color: #0000ff;">else<span style="color: #000000;"> {
<span style="color: #0000ff;">break<span style="color: #000000;">;
}
}
}
}
}

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> ThreadDemo2 {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;创建共享资源对象</span>
    TicketRes1 ticketRes=<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; TicketRes1();
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;创建线程对象</span>
    Thread w1=<span style="color: #0000ff;"&gt;new</span> Thread(ticketRes,"窗口3"<span style="color: #000000;"&gt;);
    w1.start();
    w2.start();
    w3.start();
}

}
<span style="color: #008000;">//<span style="color: #008000;">共享资源类
<span style="color: #0000ff;">class TicketRes1 <span style="color: #0000ff;">implements<span style="color: #000000;"> Runnable{
<span style="color: #0000ff;">private <span style="color: #0000ff;">static <span style="color: #0000ff;">int ticket=100<span style="color: #000000;">;
<span style="color: #0000ff;">private Object lock=<span style="color: #0000ff;">new Object();<span style="color: #008000;">//<span style="color: #008000;">锁
<span style="color: #000000;">
@Override
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> run() {
<span style="color: #008000;">//<span style="color: #008000;"> TODO Auto-generated method stub
<span style="color: #0000ff;">while(<span style="color: #0000ff;">true<span style="color: #000000;">) {
<span style="color: #0000ff;">if(!<span style="color: #000000;">TicketRes1.saleTicket()) {
<span style="color: #0000ff;">break<span style="color: #000000;">;
}
}
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">synchronized <span style="color: #0000ff;">static <span style="color: #0000ff;">boolean<span style="color: #000000;"> saleTicket() {
<span style="color: #0000ff;">if(ticket>=1<span style="color: #000000;">) {
<span style="color: #0000ff;">try<span style="color: #000000;"> {
Thread.sleep(10<span style="color: #000000;">);
} <span style="color: #0000ff;">catch<span style="color: #000000;"> (InterruptedException e) {
<span style="color: #008000;">//<span style="color: #008000;"> TODO Auto-generated catch block
<span style="color: #000000;"> e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖第"+ticket+"张票"<span style="color: #000000;">);
ticket--<span style="color: #000000;">;
<span style="color: #0000ff;">return <span style="color: #0000ff;">true<span style="color: #000000;">;
}<span style="color: #0000ff;">else<span style="color: #000000;"> {
<span style="color: #0000ff;">return <span style="color: #0000ff;">false<span style="color: #000000;">;
}
}
}

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> DeadLock {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    DeadLockThread he=<span style="color: #0000ff;"&gt;new</span> DeadLockThread(<span style="color: #0000ff;"&gt;true</span>,"小明");<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;他</span>
    DeadLockThread she=<span style="color: #0000ff;"&gt;new</span> DeadLockThread(<span style="color: #0000ff;"&gt;false</span>,"小华 ");<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;她</span>

<span style="color: #000000;"> he.start();
she.start();
}
}
<span style="color: #008000;">//<span style="color: #008000;">线程
<span style="color: #0000ff;">class DeadLockThread <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{
<span style="color: #0000ff;">boolean flag=<span style="color: #0000ff;">false<span style="color: #000000;">;
<span style="color: #0000ff;">public<span style="color: #000000;"> DeadLockThread() {

}
</span><span style="color: #0000ff;"&gt;protected</span> DeadLockThread(<span style="color: #0000ff;"&gt;boolean</span><span style="color: #000000;"&gt; flag,String name) {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;(name);
    </span><span style="color: #0000ff;"&gt;this</span>.flag=<span style="color: #000000;"&gt;flag;
}
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; run() {
    </span><span style="color: #0000ff;"&gt;while</span>(<span style="color: #0000ff;"&gt;true</span><span style="color: #000000;"&gt;) {
        </span><span style="color: #0000ff;"&gt;if</span><span style="color: #000000;"&gt;(flag) {
            </span><span style="color: #0000ff;"&gt;synchronized</span> (Lock.locka) {<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;他</span>
                System.out.println(Thread.currentThread().getName()+"抢到了locka"<span style="color: #000000;"&gt;);
            }
            </span><span style="color: #0000ff;"&gt;synchronized</span><span style="color: #000000;"&gt; (Lock.lockb) {
                System.out.println(Thread.currentThread().getName()</span>+"抢到了lockb"<span style="color: #000000;"&gt;);
                System.out.println(Thread.currentThread().getName()</span>+"可以上厕所了"<span style="color: #000000;"&gt;);

            }
        }</span><span style="color: #0000ff;"&gt;else</span><span style="color: #000000;"&gt; {
            </span><span style="color: #0000ff;"&gt;synchronized</span> (Lock.lockb) {<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;她</span>
                System.out.println(Thread.currentThread().getName()+"抢到了lockb"<span style="color: #000000;"&gt;);
            }
            </span><span style="color: #0000ff;"&gt;synchronized</span><span style="color: #000000;"&gt; (Lock.locka) {
                System.out.println(Thread.currentThread().getName()</span>+"抢到了locka"<span style="color: #000000;"&gt;);
                System.out.println(Thread.currentThread().getName()</span>+"可以上厕所了"<span style="color: #000000;"&gt;);
            }
        }
    }
}

}
<span style="color: #008000;">//<span style="color: #008000;">创建锁对象
<span style="color: #0000ff;">class<span style="color: #000000;"> Lock{
<span style="color: #0000ff;">public <span style="color: #0000ff;">static Object locka=<span style="color: #0000ff;">new<span style="color: #000000;"> Object();
<span style="color: #0000ff;">public <span style="color: #0000ff;">static Object lockb=<span style="color: #0000ff;">new<span style="color: #000000;"> Object();
}

<span style="color: #0000ff;">import<span style="color: #000000;"> java.util.Scanner;

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Demo1 {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    FlagStop flagStop=<span style="color: #0000ff;"&gt;new</span> FlagStop("线程1"<span style="color: #000000;"&gt;);
    flagStop.start();
    Scanner input</span>=<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; Scanner(System.in);
    System.out.println(</span>"输入任意字符结束主线程"<span style="color: #000000;"&gt;);
    input.next();
    flagStop.flag</span>=<span style="color: #0000ff;"&gt;false</span>;<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;主线程修改其他线程的变量</span>
    System.out.println("主线程结束"<span style="color: #000000;"&gt;);
}

}
<span style="color: #0000ff;">class FlagStop <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{
<span style="color: #008000;">//<span style="color: #008000;">定义标志 volatile:易挥发的、不稳定的,使用volatile修饰后,获取变量不会从缓存中取,从内存中取。
<span style="color: #0000ff;">volatile <span style="color: #0000ff;">boolean flag=<span style="color: #0000ff;">true<span style="color: #000000;">;
<span style="color: #0000ff;">public<span style="color: #000000;"> FlagStop() {
<span style="color: #008000;">//<span style="color: #008000;"> TODO Auto-generated constructor stub
<span style="color: #000000;"> }

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; FlagStop(String name) {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;(name);
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated constructor stub</span>

<span style="color: #000000;"> }

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; run() {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    System.out.println(Thread.currentThread().getName()+"开始执行了"<span style="color: #000000;"&gt;);
    </span><span style="color: #0000ff;"&gt;while</span><span style="color: #000000;"&gt;(flag) {

    }
    System.out.println(Thread.currentThread().getName()</span>+"执行完毕"<span style="color: #000000;"&gt;);
}

}

 

<span style="color: #0000ff;">import<span style="color: #000000;"> java.util.Scanner;

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Demo2 {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; main(String[] args) {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    WordStop wordStop=<span style="color: #0000ff;"&gt;new</span> WordStop("线程1"<span style="color: #000000;"&gt;);
    wordStop.start();
    Scanner input</span>=<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; Scanner(System.in);
    System.out.println(</span>"输入任意字符结束主线程"<span style="color: #000000;"&gt;);
    input.next();
    wordStop.stop();
    wordStop.flag</span>=<span style="color: #0000ff;"&gt;false</span>;<span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;主线程修改其他线程的变量</span>
    System.out.println("主线程结束"<span style="color: #000000;"&gt;);
}

}
<span style="color: #0000ff;">class WordStop <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{
<span style="color: #008000;">//<span style="color: #008000;">定义标志 volatile:易挥发的、不稳定的,使用volatile修饰后,获取变量不会从缓存中取,从内存中取。
<span style="color: #0000ff;">volatile <span style="color: #0000ff;">boolean flag=<span style="color: #0000ff;">true<span style="color: #000000;">;
<span style="color: #0000ff;">public<span style="color: #000000;"> WordStop() {
<span style="color: #008000;">//<span style="color: #008000;"> TODO Auto-generated constructor stub
<span style="color: #000000;"> }

</span><span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; WordStop(String name) {
    </span><span style="color: #0000ff;"&gt;super</span><span style="color: #000000;"&gt;(name);
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated constructor stub</span>

<span style="color: #000000;"> }

@Override
</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;void</span><span style="color: #000000;"&gt; run() {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    System.out.println(Thread.currentThread().getName()+"开始执行了"<span style="color: #000000;"&gt;);
    </span><span style="color: #0000ff;"&gt;while</span><span style="color: #000000;"&gt;(flag) {

    }
    System.out.println(Thread.currentThread().getName()</span>+"执行完毕"<span style="color: #000000;"&gt;);
}

}

  

<span style="color: #0000ff;">import<span style="color: #000000;"> java.io.IOException;

<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> Demo3 {

</span><span style="color: #0000ff;"&gt;public</span> <span style="color: #0000ff;"&gt;static</span> <span style="color: #0000ff;"&gt;void</span> main(String[] args) <span style="color: #0000ff;"&gt;throws</span><span style="color: #000000;"&gt; IOException,InterruptedException {
    </span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; TODO Auto-generated method stub</span>
    InterruptStop interruptStop=<span style="color: #0000ff;"&gt;new</span><span style="color: #000000;"&gt; InterruptStop();
    interruptStop.start();
    System.out.println(</span>"在10秒之内输入任意符号结束"<span style="color: #000000;"&gt;);
    System.in.read();
    interruptStop.interrupt();</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt;打断正在休眠的线程</span>

<span style="color: #000000;"> interruptStop.join();
System.out.println("主线程结束..."<span style="color: #000000;">);
}
}
<span style="color: #0000ff;">class InterruptStop <span style="color: #0000ff;">extends<span style="color: #000000;"> Thread{
@Override
<span style="color: #0000ff;">public <span style="color: #0000ff;">void<span style="color: #000000;"> run() {
<span style="color: #0000ff;">try<span style="color: #000000;"> {
Thread.sleep(10000);<span style="color: #008000;">//<span style="color: #008000;">抛出一个异常InterruptedException
} <span style="color: #0000ff;">catch<span style="color: #000000;"> (InterruptedException e) {
<span style="color: #008000;">//<span style="color: #008000;"> TODO Auto-generated catch block
<span style="color: #008000;">//<span style="color: #008000;"> e.printStackTrace();
System.out.println("执行了catch"<span style="color: #000000;">);
}
System.out.println("子线程执行完毕"<span style="color: #000000;">);
}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读