java多线程
来源:互联网 发布:sql数据库修复软件 编辑:程序博客网 时间:2024/06/07 07:56
实验过程:
(源程序代码,即.java文件)
第一题:
/*1、 建立一个线程,其任务是每隔1s生成一个随机数;要求分别使用以下方法:
继承Thread类
实现Runnable接口的方法
*/
package szu.cn;
import java.util.*;
public class thread_1 extends Thread {
/**
* @param args
*/
public void run(){
while(true){
Random random1=new Random();
System.out.println(this.currentThread()+"thread方式随机数为:"+random1.nextInt());
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("nimen");
thread_1 thread1=new thread_1();
threadrunable thread_runable=new threadrunable();
Thread thrd_run=new Thread(thread_runable);
thread1.start();
thrd_run.start();
}
}
class threadrunableimplements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
Random random1=new Random();
System.out.println("runable方式随机数为:"+random1.nextInt());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
第二题:
package szu.cn;
import java.util.Random;
/*要求:两个线程同时运行,一个线程负责生成随机数,每生成一个休眠1s;
* 另外一个线程逐个检查该检查随机数,确定它是否是素数,每检查一个休眠1s。
* 主线程负责检查生成的随机数超过90就结束程序。*/
public class thread_2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Check check=new Check();
random_1 ran=new random_1(check);
Thread t1=new Thread(ran);
t1.start();
check_num ch=new check_num(check);
Thread t2=new Thread(ch);
t2.start();
while(check.num!=10){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
check.flag=false;
}
}
class random_1implements Runnable{
Check check;
random_1(Check check){
this.check=check;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(check.flag){
// synchronized(check){
check.random_t();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//}
}
}
}
class check_numimplements Runnable{
Check check;
check_num (Check check){
this.check=check;
}
@Override
public void run() {
// TODO Auto-generated method stub
//System.out.println("是素数");
while(check.flag){
//if(check.num==90) break;
//int sushu=check.sushu;
check.sushu(check.sushu);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Check {
int num=0;
int sushu;
boolean flag=true;
synchronized void random_t(){
Random random1=new Random();
sushu=random1.nextInt()%100;
System.out.println("第"+num+"随机数为:"+sushu);
num++;
}
synchronized boolean sushu(int ar){//这种方法判断素数效率很低,可以利用筛选法进行素数的判断
boolean tag=true;
if(ar<2)return tag;
for(int i=ar-1;i>1;i--){
if(ar%i==0){
tag=false;
break;
}
}
if(tag)
System.out.println(ar+"是素数");
return tag;
}
}
第三题:
package szu.cn;
import java.text.SimpleDateFormat;
import java.util.Date;
/*编写java应用程序,在主线程中有2个线程:PrintTime和Supervisor。线程PrintTime负责输出当前的时间,共输出10个
* ,每输出一个就准备休息5s。Supervisor线程一直在吵醒PrintTime线程。当PrintTime工作完成后,Supervisor线程也结束运行。*/
public class thread_3 {
public static void main(String[] args) {
PrintTime tr1=new PrintTime();
tr1.start();
Supervisor tr2=new Supervisor(tr1);
tr2.start();
}
}
class PrintTimeextends Thread {
int num=0;
boolean flag=true;
@Override
public void run() {
System.out.println("start");
while(num<10) {
///
//数据处理
///
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
System.out.println(df.format(new Date()));// new Date()为获取当前系统时间
num++;
try {
sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
}
}
//System.out.println("stop");
//super.run();
flag=false;
}
}
class Supervisorextends Thread {
PrintTime p;
Supervisor(PrintTime p){
this.p=p;
}
@Override
public void run() {
while(p.flag){
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
p.interrupt();
//super.run();
}
}
}
实验结果及数据处理分析:
( 运行程序截图)
第一题:
第二题:
第三题:
实验结论:
多线程可以提高资源的利用率,但是多线程中的公用的资源部分要进行同步。Sleep和wait的区别:
1这两个方法来自不同的类分别是Thread和Object
2. 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3.s leep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
实验收获及思考
(实验心得)
线程同步是个很重要的概念:与linux C编程的同步锁,条件变量锁是有同工之美;
sleep属于程序的,如果睡不好就会有异常,如被interreput了,而wait是属于对象的,就没有异常这个概念了
wait的概念和C下的linux编程的条件变量锁的概念是一样的。
- 【Java多线程】多线程死锁
- Java 多线程
- java 多线程
- java多线程
- JAVA多线程
- java多线程
- JAVA多线程
- java多线程
- JAVA 多线程
- Java多线程
- java多线程
- JAVA 多线程
- Java 多线程
- Java 多线程
- java多线程
- Java 多线程
- Java多线程
- java 多线程
- 用谷歌浏览器来当手机模拟器
- getopt()函数
- 如何学好C++语言
- Windows系统盘清理
- Linux Kernel 2.6.37 启动过程笔记 :main详解
- java多线程
- java中的栈、堆和常量池
- JQuery之append和appendTo的区别,还有js中的appendChild用法
- linux c 弹出对话框源码
- Android 用Animation-list实现逐帧动画
- Redis Sentinel;Redis Sentinel配置;redis集群;redis故障转移
- 查看SGA和PGA使用率
- 初探架构之美
- java中的Font