# JAVA 实验六:线程
# 实验目的
- 掌握线程的概念。
- 掌握线程的创建方法。
- 掌握线程的常用方法。
- 掌握线程同步的方法
- 掌握线程联合的方法。
# 实验内容
将实验 6 文件夹中所附的源程序 “RWthread.java” 改为用线程联合实现。
# 实验代码
# 原 RWthread.java 代码
| import java.util.*; |
| class RWthread |
| { |
| public static void main(String args[]) |
| { |
| String readName="读线程",writeName="写线程"; |
| ReadWrite rw=new ReadWrite(readName,writeName); |
| Thread read,write; |
| read=new Thread(rw); |
| write=new Thread(rw); |
| read.setName(readName); |
| write.setName(writeName); |
| read.start(); |
| write.start(); |
| } |
| } |
| class ReadWrite implements Runnable |
| { |
| String ID=null; |
| String name=null; |
| String readName,writeName; |
| boolean flag=false; |
| public ReadWrite(String s1,String s) |
| { |
| readName=s1; |
| writeName=s; |
| } |
| public void run() |
| { |
| readOrWrite(); |
| } |
| public synchronized void readOrWrite() |
| { |
| if(Thread.currentThread().getName().equals(readName)) |
| { |
| Scanner reader=new Scanner(System.in); |
| while(true) |
| { |
| if(flag) |
| { |
| try{ |
| wait(); |
| }catch(InterruptedException e){} |
| } |
| System.out.println("请输入学号:"); |
| ID=reader.nextLine(); |
| if(ID.equals("finish")) |
| { |
| System.out.println("\n读线程和写线程工作结束!"); |
| flag=true; |
| notify(); |
| reader.close(); |
| return; |
| } |
| System.out.println("请输入姓名:"); |
| name=reader.nextLine(); |
| flag=true; |
| notify(); |
| } |
| } |
| else if(Thread.currentThread().getName().equals(writeName)) |
| { |
| while(true) |
| { |
| if(!flag) |
| { |
| try{ |
| wait(); |
| }catch(InterruptedException e){} |
| } |
| if(ID.equals("finish")) |
| return; |
| System.out.println("\n输出学号:"+ID+",输出姓名:"+name); |
| System.out.println(); |
| flag=false; |
| notify(); |
| } |
| } |
| } |
| } |
# 改成线程联合实现后
| import java.util.*; |
| class RWthread |
| { |
| public static void main(String args[]) |
| { |
| ReadWrite rw=new ReadWrite(); |
| rw.write.start(); |
| } |
| } |
| class ReadWrite implements Runnable |
| { |
| String ID=null; |
| String name=null; |
| boolean flag=false; |
| String readName="读线程",writeName="写线程"; |
| Thread read,write; |
| ReadWrite() |
| { |
| write=new Thread(this); |
| write.setName(writeName); |
| } |
| public void run() |
| { |
| if(Thread.currentThread().getName().equals(readName)) |
| { |
| |
| Scanner reader=new Scanner(System.in); |
| System.out.println("请输入学号:"); |
| ID=reader.nextLine(); |
| if(ID.equals("finish")) |
| { |
| System.out.println("\n读线程和写线程工作结束!"); |
| |
| reader.close(); |
| return; |
| } |
| System.out.println("请输入姓名:"); |
| name=reader.nextLine(); |
| } |
| else if(Thread.currentThread().getName().equals(writeName)) |
| { |
| while(true) |
| { |
| if(read!=null) |
| { |
| read.stop(); |
| } |
| read=new Thread(this); |
| read.setName(readName); |
| read.start(); |
| try{ |
| read.join(); |
| }catch(InterruptedException e){} |
| if(ID.equals("finish")) |
| return; |
| System.out.println("\n输出学号:"+ID+",输出姓名:"+name); |
| System.out.println(); |
| } |
| } |
| } |
| } |