Java多线程基础二
分类:Java作者:编程之家用户
}
<span style="color: #0000ff;">public <span style="color: #0000ff;">class<span style="color: #000000;"> ThreadDemo1 {
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub
</span><span style="color: #008000;">//</span><span style="color: #008000;">创建共享资源对象</span>
TicketRes ticketRes=<span style="color: #0000ff;">new</span><span style="color: #000000;"> TicketRes();
</span><span style="color: #008000;">//</span><span style="color: #008000;">创建线程对象</span>
Thread w1=<span style="color: #0000ff;">new</span> Thread(ticketRes,"窗口1"<span style="color: #000000;">);
Thread w2</span>=<span style="color: #0000ff;">new</span> Thread(ticketRes,"窗口2"<span style="color: #000000;">);
Thread w3</span>=<span style="color: #0000ff;">new</span> Thread(ticketRes,"窗口3"<span style="color: #000000;">);
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;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub
</span><span style="color: #008000;">//</span><span style="color: #008000;">创建共享资源对象</span>
TicketRes1 ticketRes=<span style="color: #0000ff;">new</span><span style="color: #000000;"> TicketRes1();
</span><span style="color: #008000;">//</span><span style="color: #008000;">创建线程对象</span>
Thread w1=<span style="color: #0000ff;">new</span> Thread(ticketRes,"窗口3"<span style="color: #000000;">);
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;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span>
DeadLockThread he=<span style="color: #0000ff;">new</span> DeadLockThread(<span style="color: #0000ff;">true</span>,"小明");<span style="color: #008000;">//</span><span style="color: #008000;">他</span>
DeadLockThread she=<span style="color: #0000ff;">new</span> DeadLockThread(<span style="color: #0000ff;">false</span>,"小华 ");<span style="color: #008000;">//</span><span style="color: #008000;">她</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;">protected</span> DeadLockThread(<span style="color: #0000ff;">boolean</span><span style="color: #000000;"> flag,String name) {
</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(name);
</span><span style="color: #0000ff;">this</span>.flag=<span style="color: #000000;">flag;
}
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {
</span><span style="color: #0000ff;">while</span>(<span style="color: #0000ff;">true</span><span style="color: #000000;">) {
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(flag) {
</span><span style="color: #0000ff;">synchronized</span> (Lock.locka) {<span style="color: #008000;">//</span><span style="color: #008000;">他</span>
System.out.println(Thread.currentThread().getName()+"抢到了locka"<span style="color: #000000;">);
}
</span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;"> (Lock.lockb) {
System.out.println(Thread.currentThread().getName()</span>+"抢到了lockb"<span style="color: #000000;">);
System.out.println(Thread.currentThread().getName()</span>+"可以上厕所了"<span style="color: #000000;">);
}
}</span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {
</span><span style="color: #0000ff;">synchronized</span> (Lock.lockb) {<span style="color: #008000;">//</span><span style="color: #008000;">她</span>
System.out.println(Thread.currentThread().getName()+"抢到了lockb"<span style="color: #000000;">);
}
</span><span style="color: #0000ff;">synchronized</span><span style="color: #000000;"> (Lock.locka) {
System.out.println(Thread.currentThread().getName()</span>+"抢到了locka"<span style="color: #000000;">);
System.out.println(Thread.currentThread().getName()</span>+"可以上厕所了"<span style="color: #000000;">);
}
}
}
}
}
<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;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span>
FlagStop flagStop=<span style="color: #0000ff;">new</span> FlagStop("线程1"<span style="color: #000000;">);
flagStop.start();
Scanner input</span>=<span style="color: #0000ff;">new</span><span style="color: #000000;"> Scanner(System.in);
System.out.println(</span>"输入任意字符结束主线程"<span style="color: #000000;">);
input.next();
flagStop.flag</span>=<span style="color: #0000ff;">false</span>;<span style="color: #008000;">//</span><span style="color: #008000;">主线程修改其他线程的变量</span>
System.out.println("主线程结束"<span style="color: #000000;">);
}
}
<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;">public</span><span style="color: #000000;"> FlagStop(String name) {
</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(name);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated constructor stub</span>
<span style="color: #000000;"> }
@Override
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> run() {
</span><span style="color: #008000;">//</span><span style="color: #008000;"> TODO Auto-generated method stub</span>
System.out.println(Thread.currentThread().getName()+"开始执行了"<span style="color: #000000;">);
</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(flag) {
}
System.out.println(Thread.currentThread().getName()</span>+"执行完毕"<span style="color: #000000;">);
}
}