JAVA程序设计_Java多线程机制_
- 格式:pdf
- 大小:930.77 KB
- 文档页数:27
多线程实习题目实习题目1:源代码:/**Ticket.java*/package lab7;class Ticket{int ticketNum=50;boolean flag=false;//定义票是否卖完public Ticket(){}public Ticket(int num){this.ticketNum=num;}public synchronized void sellTicket(Seller s){if(ticketNum>0){System.out.println("第"+s.num+"售票点卖出了第"+ticketNum +"张票……");ticketNum--;}else{flag=true;}}}/**Seller.java*/package lab7;class Seller implements Runnable{int num;Ticket rs;public Seller(int num,Ticket rs){this.num=num;this.rs=rs;}public void run(){while(!rs.flag){rs.sellTicket(this);try{Thread.sleep(100);}catch(InterruptedException e){e.printStackTrace();}}}}/**Exercise1.java*/package lab7;class Exercise1{public static void main(String[]args){ Ticket rs=new Ticket(100);for(int i=0;i<10;i++){new Thread(new Seller(i,rs)).start();}}}程序运行结果:…实习题目2:源代码:/**CBank.java*/package lab7;class CBank{private static int sum=0;public static synchronized void add(int n){int tmp=sum;tmp=tmp+n;//累加汇款总额try{Thread.sleep((int)(10000*Math.random()));//小睡几秒钟}catch(InterruptedException e){}sum=tmp;System.out.println("sum="+sum);}}/**CCustomer.java*/package lab7;class CCustomer extends Thread//CCustomer类,继承自Thread类{public void run(){//run()methodfor(int i=1;i<=3;i++)CBank.add(100);//将100元分三次汇入}}/**Ex7_1.java*/package lab7;public class Ex7_1{public static void main(String args[]){CCustomer c1=new CCustomer();CCustomer c2=new CCustomer();c1.start();c2.start();}}题目解答:①在题目给定的程序中,每一次程序的运行的结果不大相同,因为两个线程没有在同一进程内多线程共享资源共享.synchronized d关键字,这样程序②本程序将CBank类的add方法变为同步方法,即加上synchronize的每次运行结果均相同,程序的运行结果如下:③对于该题目为什么要进行异常处理?答:因为对于大多数错误处理机制依靠的是程序员自身的警惕性,而不是编程语言强制的,因如果程序员不够警惕,出错的几率很大如果任何线程中断了该线程,java中把异常处理机制放到编程语言中,因此强制程序员去使用他,不然无法编译通过,更重要的是异常不能被忽略,保证一定要去处理它,异常提供了从错误状态进行可靠恢复的途径,而不需要退出程序.对于该题目为什么要进行处理,因为任何其他线程中断了该线程,就会抛出异常,必须进行异常处理,进行异常处理以后,当前线程的中断状态被清除.实习题目3:源代码:/**Bread.java*/package lab7;public class Bread implements Runnable{int number=0;//面包数量public synchronized void produce(){System.out.println("启动消费\n还没有生产出面包,等待中...");System.out.println("开始生产...");while(number<5){number++;System.out.println(number+"个");try{Thread.sleep(200);}catch(InterruptedException ee){ee.printStackTrace();}}System.out.println("生产完毕.");notify();}public synchronized void consume(){System.out.println("开始消费...");while(number>0){System.out.println(number+"个");number--;try{Thread.sleep(200);}catch(InterruptedException ee){ee.printStackTrace();}}System.out.println("消费完毕.");}public void run(){if(Thread.currentThread().getName().equals("breadProduce")){produce();}elseif(Thread.currentThread().getName().equals("breadConsume")){ consume();}}}/**Exercise3.java*/package lab7;public class Exercise3{public static void main(String[]args){Bread bread=new Bread();Thread thread1=new Thread(bread);Thread thread2=new Thread(bread);thread1.setName("breadProduce");thread2.setName("breadConsume");thread1.start();thread2.start();}}程序运行结果:实习总结:本次的实习相对比较顺利,我们无法控制相同优先级的线程调度顺序,但是我们可以使用线程同步控制可达到我们想要的结果.最重要的是要理解线程是如何进行资源共享的.线程同步使得众线程对数据可以有条不紊地操作而不会发生混乱,而且线程同步的使用使得线程之间有了CPU的相互转让使得其他线程有获得CPU使用权.网络基础实习题目实习题目1:源代码:/**Exercise1.java*/package internet;import .*;public class Exercise1{public static void main(String[]args){String str="";InetAddress address1=null;InetAddress address2=null;try{address1=InetAddress.getByName(str);address2=InetAddress.getLocalHost();}catch(UnknownHostException ee){ee.printStackTrace();}finally{System.out.println("学校IP地址:"+address1.getHostAddress());System.out.println("本机的IP地址:"+address2.getHostAddress());System.out.println("本机的名称"+address2.getHostName());}}}程序的运行结果:实习题目2:源代码:/**Client.java*/package internet;import .*;import java.io.*;public class Client{public static void main(String[]args){Socket mysocket;DataInputStream cin1=null;DataOutputStream cout1=null;DataInputStream cin2=null;try{mysocket=new Socket("192.168.208.136",8888);cin1=new DataInputStream(mysocket.getInputStream());cout1=new DataOutputStream(mysocket.getOutputStream());cin2=new DataInputStream(System.in);String r;while(true){r=cin2.readLine();cout1.writeUTF(r);r=cin1.readUTF();System.out.println(r);if(r.equalsIgnoreCase("Bye")){cin1.close();cin2.close();cout1.close();mysocket.close();break;}Thread.sleep(1000);}}catch(Exception ee){ee.printStackTrace();}}}/**Server.java*/package internet;import java.io.*;import .*;import java.util.*;import java.text.SimpleDateFormat;public class Server{public static void main(String[]args){ServerSocket server=null;Socket matcher=null;DataOutputStream cout=null;DataInputStream cin=null;SimpleDateFormat form=new SimpleDateFormat("HH:mm:ss");String r;try{server=new ServerSocket(8888);}catch(IOException ee){ee.printStackTrace();}try{System.out.println("The Server starts...");matcher=server.accept();cout=new DataOutputStream(matcher.getOutputStream());cin=new DataInputStream(matcher.getInputStream());String time;while(true){byte[]b;r=cin.readUTF();if(r.equalsIgnoreCase("Time")){System.out.println(r);time="Current time is:"+form.format(new Date());cout.writeUTF(time);}else if(r.equalsIgnoreCase("Exit")){cout.writeUTF("Bye");cout.close();cin.close();server.close();matcher.close();}else{System.out.println(r);cout.writeUTF("Unknown request,please repeat...");}}}catch(Exception ee){System.out.println("Connection interrupted...");}}}程序的运行结果如下(由于虚拟机没安装中文输入法,不支持中文,暂用英文):客户端程序运行结果:服务端(虚拟机端)程序的运行结果:实习题目3:源代码:/**UDPMessage.java*/package internet;import java.awt.*;import java.awt.event.*;import java.io.IOException;import .*;import javax.swing.*;public class UDPMessage extends JFrame implements ActionListener,Runnable{private JTextArea text;private JTextField ipText;private JTextField sendText;private JButton button;private DatagramSocket socket;private JScrollBar vsBar;Thread thread;public UDPMessage(){setTitle("UDP Chat Frame");setBounds(100,100,400,300);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setLayout(new BorderLayout());text=new JTextArea();text.setEditable(false);JScrollPane textPanel=new JScrollPane(text);vsBar=textPanel.getVerticalScrollBar();add(textPanel,BorderLayout.CENTER);JPanel panel=new JPanel();BorderLayout panelLayout=new BorderLayout();panelLayout.setHgap(5);panel.setLayout(panelLayout);ipText=new JTextField("172.17.62.138");panel.add(ipText,BorderLayout.WEST);sendText=new JTextField();panel.add(sendText,BorderLayout.CENTER);button=new JButton("Send");panel.add(button,BorderLayout.EAST);add(panel,BorderLayout.SOUTH);setVisible(true);server();button.addActionListener(this);}private void server(){thread=new Thread(this);thread.start();}public void actionPerformed(ActionEvent ev){try{bytebuffer[]=(InetAddress.getLocalHost().getHostAddress()+"\n"+sendText.getText().trim()+"\n").getBytes();InetAddressaddress1=InetAddress.getByName(ipText.getText().trim());InetAddress address2=InetAddress.getLocalHost();DatagramPacket datapack=newDatagramPacket(buffer,buffer.length,address1,8888);DatagramSocket maildata=new DatagramSocket();maildata.send(datapack);text.append(InetAddress.getLocalHost().getHostAddress()+"\n "+sendText.getText().trim()+"\n");sendText.setText(null);}catch(Exception ee){ee.printStackTrace();}}public void run(){DatagramPacket pack=null;DatagramSocket maildata=null;byte[]data=new byte[8192];try{pack=new DatagramPacket(data,data.length);maildata=new DatagramSocket(8888);}catch(Exception ee){ee.printStackTrace();}while(true){if(maildata==null)break;elsetry{maildata.receive(pack);String message=newString(pack.getData(),0,pack.getLength());text.append(message);}catch(Exception ee){ee.printStackTrace();}}}public static void main(String args[]){JFrame frame=new UDPMessage();}}说明:其实还有另外一程序,大同小异,文件名为“CopyOfUDPMessage.java”,本次两个程序“UDPMessage.java”在Unix虚拟机里面,“CopyOfUDPMessage.java”在Windows环境下。
java多线程程序设计实验总结一、实验目的本次实验旨在通过编写Java多线程程序,掌握多线程编程的基本概念和技能,理解多线程程序的运行原理,提高对Java语言的熟练度。
二、实验内容本次实验分为三个部分:创建线程、线程同步和死锁。
2.1 创建线程创建线程有两种方式:继承Thread类和实现Runnable接口。
继承Thread类需要重写run方法,在run方法中编写线程执行的代码;实现Runnable接口需要实现run方法,并将其作为参数传入Thread类的构造函数中。
在创建多个线程时,可以使用同一个Runnable对象或者不同的Runnable对象。
2.2 线程同步当多个线程同时访问共享资源时,可能会出现数据不一致等问题。
为了避免这种情况,需要使用同步机制来保证各个线程之间的协调运行。
常见的同步机制包括synchronized关键字和Lock接口。
synchronized关键字可以用来修饰方法或代码块,在执行该方法或代码块时,其他所有试图访问该方法或代码块的线程都必须等待当前执行完成后才能继续执行。
Lock接口提供了更加灵活和高级的锁机制,可以支持更多种类型的锁,如读写锁、可重入锁等。
2.3 死锁死锁是指两个或多个线程在互相等待对方释放资源的情况下,都无法继续执行的现象。
死锁的发生通常由于程序设计不当或者资源分配不合理所导致。
为避免死锁的发生,可以采取以下措施:避免嵌套锁、按照固定顺序获取锁、避免长时间占用资源等。
三、实验过程本次实验我编写了多个Java多线程程序,包括创建线程、线程同步和死锁。
其中,创建线程部分我使用了继承Thread类和实现Runnable 接口两种方式来创建线程,并测试了多个线程之间的并行执行情况;在线程同步部分,我使用synchronized关键字和Lock接口来保证共享资源的访问安全,并测试了多个线程同时访问共享资源时是否会出现数据不一致等问题;在死锁部分,我编写了一个简单的死锁程序,并通过调整程序代码来避免死锁的发生。
2012年JAVA程序设计习题及答案191.java的输入输出流包括_______、字符流、文件流、对象流以及多线程之间通信的管道。
2.java中的非字符输出流都是________抽象类的子类。
3.java对I/O访问还提供了同步处理机制,保证某时刻只有一个线程访问一个I/O流,这就是_______4. java中的字符输出流都是抽象类________的子类。
5. DataOutputStream数据流向文件里写数据的方法为__________.答案:1. 字节流2. OutputStream3. 过滤流4. Writer5。
write()11.在编写执行JAVA程序的过程中需要用到一些工具,SUN公司为我们提供了一套JDK工具,它主要包括:javac。
exe、java.exe、_____、javap。
exe、jkb。
exe12. JAVA程序包括源代码(。
java文件)、______、由归档工具jar生成的.jar文件、对象状态序列化。
ser文件。
13. 在JAVA语言中,为将源代码翻译成______文件时产生的错误称为编译错误.而将程序在运行中产生的错误称为运行错误。
14。
Java Application应用程序的编写和执行分3步进行:编写源代码、编译源代码、_____。
15. 每个java应用程序可以包括许多方法,但必须有且只能有一个_____方法。
答案:11。
javadoc.exe(或java文档生成器)12。
由编译器生成的类(。
class文件)13. 字节码14。
解释执行15. main6。
关于对象的删除,下列说法正确的是A。
必须由程序员完成对象的清除B。
java把没有引用的对象作为垃圾收集起来并释放C。
只有当程序中调用System.gc()方法时才能进行垃圾收集D. java中的对象都很小,一般不进行删除操作。
7. 下列说法正确的是A. java中包的主要作用是实现跨平台功能B。
package语句只能放在import语句后面C. 包(package)由一组类(class)和界面(interface)组成D. 可以用#include关键词来标明来自其它包中的类;8. Applet是一个面板容器,它默认使用()布局管理器A。
第1章、Java语言简介第2知识点、Java程序的开发过程【单项选择】1 、下列关于classpath环境变量的说法中,哪一个是正确的(难度系数:易)A、classpath配置一次后可永久使用B、没有classpath环境变量就不能运行Java程序C、classpath环境变量可以让虚拟机找到class文件的目录D、查看当前classpath配置的命令是:classpath参考答案:C答案解析:classpath环境变量可以让虚拟机找到class文件目录,没有配置classpath环境变量时,java虚拟机会自动将其设置为“.”。
查看当前classpath的命令是set classpath;【单项选择】2 、在下列说法中,选出最正确的一项是( )。
(难度系数:易)A、Java语言是以类为程序的基本单位的B、Java语言是不区分大小写的C、多行注释语句必须以//开始D、在Java语言中,类的源文件名和该类名可以不相同参考答案:A【单项选择】3 、Java属于以下哪种语言? (难度系数:易)A、机器语言B、汇编语言C、高级语言D、以上都不对参考答案:C答案解析:Java是一门高级编程语言【单项选择】4 、下列选项中不属于Java虚拟机的执行特点的一项是( )。
(难度系数:易)A、异常处理B、多线程C、动态链接D、简单易学参考答案:D【单项选择】5、下列命令中,可以将文档注释提取出来生成帮助文档的是()(难度系数:易)A、javacB、javaC、javadocD、jar参考答案:C答案解析:可以使用javadoc命令将文档注释提取出来生成帮助文档【单项选择】6 、下列关于Java特点的描述中,错误的是?(难度系数:易)A、Java语言不支持指针B、Java具有自动垃圾回收的机制C、Java只能运行在Window和Linux平台D、Java允许多个线程同时执行参考答案:C答案解析:JAVA是一门面向对象的语言,它没有指针的概念,并提供了自动垃圾回收的机制,具有跨平台,多线程等特点。
JAVA开发中的多线程编程技术Java作为一种广泛应用于企业级应用以及各种工业自动化系统的编程语言,其对于处理多线程并发的问题起到了巨大的作用。
在Java开发过程中,我们经常会遇到需要多线程并发处理的情况,比如高并发的Web服务、大数据处理、图像处理等等。
如何正确合理的使用Java多线程技术是一个非常重要的问题。
本文将详细讲解Java开发中的多线程编程技术。
1.了解Java线程模型Java语言具有完善的线程模型,并提供了Thread类以及Runnable接口,方便程序员进行多线程编程。
在进行Java多线程编程的过程中,必须先理解Java的线程模型,包括线程的创建、使用、同步、互斥、线程间通信等。
同时,也要掌握Java虚拟机的内存结构以及线程调度器的工作原理,这些对多线程编程至关重要。
2.使用synchronized实现线程同步在多线程编程中,需要涉及到许多复杂的操作,如多个线程同时对同一共享数据进行读写操作会造成数据不一致等问题。
这时需要使用synchronized关键字来进行同步。
通过对象锁的机制,保证每个时间段只有一个线程能够访问同一个对象的同步代码块。
当线程进入一个对象的同步块时,将获得该对象的锁,只有等线程退出同步块或发生异常时才会释放锁,其他线程才能进入同步块。
通过synchronized关键字的同步机制能控制线程的读写顺序,使多个线程协同工作,防止数据不一致的问题。
3.使用volatile变量实现线程间通信在多线程编程中,需要进行线程间的通信。
在Java语言中,volatile变量可以用来实现线程间的通信。
当一个变量被声明为volatile变量后,所有线程对这个变量的读写操作都会直接在内存中进行,而不会使用线程的缓存中间值。
这样可以避免数据缓存的不一致,并保证在不同线程中读写的顺序是一致的,从而实现了线程之间的通信。
4.掌握并发包中的工具类Java并发包提供了许多实用的工具类,方便程序员在多线程编程中使用。