实验五 多线程程序设计(汽院含答案)
实验五、多线程并发服务器编程
实验五、多线程并发服务器编程
一、实验目的
1、学习Linux操作系统的多线程的基本概念以及进程与线程的区别;
2、掌握编写多线程程序的一般方法;
3、熟悉多线程并发服务器的设计思路,以及多线程程序的编译链接方法。
二、实验内容
线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。现在多线程技术已经被许多操作系统所支持,包括Windows/NT以及Unix/Linux。
为什么有了进程的概念后,还要再引入线程呢?使用多线程到底有哪些好处?什么的系统应该选用多线程?使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种"昂贵"的多任务工作方式。而运行于一个进程中的多个线程,它们彼此之间使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程所花费的空间,而且线程间彼此切换所需的时间也远远小于进程间切换所需要的时间。据统计一个进程的开销大约是一个线程开销的30倍左右。
使用多线程的理由之二是线程间方便的通信机制。对不同进程来说,它们具有独立的数据空间,要进行数据的传递只能通过通信的方式进行,这种方式不仅费时,而且很不方便。线程则不然,由于同一进程下的线程之间共享数据空间,所以一个线程的数据可以直接为其它线程所用,这不仅快捷,而且方便。当然,数据的共享也带来其他一些问题,有的变量不能同时被两个线程所修改,有的子程序中声明为static的数据更有可能给多线程程序带来灾难性的打击,这些正是编写多线程程序时最需要注意的地方。
实验五 多线程编程
int data; pthread_mutex_lock(&b->lock); /*if buffer empty,so waiting*/ if (b->writepos == b->readpos) { pthread_cond_wait(&b->notempty, &b->lock); } /*read data from buffer,and move read point*/ data = b->buffer[b->readpos]; b->readpos++; if (b->readpos >= BUFFER_SIZE) b->readpos = 0; /* wakeup reader*/ pthread_cond_signal(&b->notfull); /*unlock buffer*/ pthread_mutex_unlock(&b->lock); return data; } /*reader thread put 1 to 10 int data to buffer.writer thread get int data from buffer.*/ #define OVER -1 struct prodcons buffer; void *producer(void *data) { int n; for (n = 0; n < 10; n++) { printf("%d --->\n", n); put(&buffer, n); } put(&buffer, OVER); return NULL; } void *consumer(void *data) { int d; while (1) { d = get(&buffer); if (d == OVER) break; printf("--->%d \n", d); } return NULL; }
实训五 函数程序设计和答案
实训五函数程序设计
(附:答案在后面)
班级:姓名:学号:
一、实训目标
熟练掌握函数的定义、调用和调试方法。
1、学会函数的接口设计,能够快速构建函数框架。
2、掌握函数的定义和调用方法。
3、掌握函数的调试方法(step into)。
4、理解函数的形参、实参、返回值的概念。
二、语法基础
1、函数是一个完成特定工作的独立程序模块,包括和两种。
2、对于用户自定义函数,用户需要完成函数的定义、函数的声明及函数的调用三部分内容;而对于
库函数用户只需要完成及头文件的包括。
3、以下说法中正确的是。
A)C语言程序总是从第一个定义的函数开始执行
B)在C语言程序中,要调用的函数必须在main( )函数中定义
C)C语言程序总是从main( )函数开始执行
D)C语言程序中的main( )函数必须放在程序的开始部分
4、程序填空。下列两个函数模块,请完成函数体部分内容。
1) 函数功能:求两个数的较大值。
/*函数功能:求两个数的最大值
函数入口参数:双精度浮点型 x 表被比较的第一个数
双精度浮点型 y 表被比较的第二个数
函数返回值:较大的数 (类型为double)
*/
double max(double x, double y)
{
2) 函数功能:输入一个整数n 的值,从屏幕显示n 个星号(‘*’)。
5、函数调用时的实参和函数定义时的形参可以是相同的变量名吗? ;如果两者变量名
完全相同,那么它们代表的同一内存空间吗? ;写出下面程序的输出结果。
/*函数功能:输入一个数n ,输出n 个星号
函数入口参数:整型 n 表星号的个数 函数返回值:无 */
太原理工大学java实验5到7
本科实验报告
课程名称: Java语言程序设计
实验项目:多线程编程
实验地点:软件楼
专业班级:软件工程1410 学号: 2014005791 学生姓名:王超
指导教师:李君婵
2016年1 月 17 日
实验记录(写出实验内容中3的程序代码和运行结果)
3.package com.wangchao.exercise5;
import java.util.Date;
public class Threethread extends Thread {
public static void main(String[] args) {
Threethread t1 = new Threethread();
t1.start();
Threethread t2 = new Threethread();
t2.start();
Threethread t3 = new Threethread();
t3.start();
}
public void run() {
System.out.println("当前运行的线程 " + this.getName() + " "
+ new Date(System.currentTimeMillis()));
}
}
遇到的问题和解决方法
在编写程序时对于接口的概念理解不深,通过自己看书实验加深了认识。心得体会
线程是提高cpu运行效率的方法,内容很重要,需要认真学习和理解。
本科实验报告
课程名称: Java语言程序设计
实验项目:图形用户界面编程
实验地点:软件楼
专业班级:软件工程1410 学号: 2014005791 学生姓名:王超
JAVA实验五
实验五多线程程序设计
实验目的:理解线程的概念、线程的生命周期,掌握多线程的编程:继承Thread 类与使用Runnable接口。
实验内容:
多线程是指同时存在的几个执行体,按几条不同的执行线索共同工作的情况。Java语言的一个重要功能特点就是内置对多线程的支持,踏实的编程人员可以很方便的开发出具有多现成功能,能同时处理多个任务的功能强大的应用程序。
Java中编程实现多线程应用有两种途径:一种是创建用户自己的线程子类,另一种是在用户自己的类中实现Runable接口。无论那种方法,都需要使用到Java基础类库中的Thread类及其方法。
创建Thread类的子类:在这个途径中,用户程序需要创建自己的Thread 类的子类,并在子类中重新定义自己的run()方法,这个run()方法中包含了用户线程的操作。这样在用户程序需要建立自己的线程时,他只需要创建一个一定已定义好的Thread子类的实例就可以了。
实现Runnable接口:在这个途径中,已经有了一个父类的用户类可以已通过实现Runable()接口的方法来定义用户线程的操作。我们知道,Runable接口只有一个方法run(),实现这个接口,就必须要定义run()方法的具体内容。用户新建现成的操作也有这个方法来决定。定义好run()方法后,当用户程序需要建立新线程时,只要以这个实现了Runnable()方法的类为参数创建系统类Thread的对象,就可以把用户实现的run()方法继承过来。
1、用创建Thread类的子类的方法实现多线程:
public class FruitThread extends Thread{
实验五 多线程程序设计 实验报告
实验五多线程程序设计实验报告
一、实验目的
1. 熟悉利用Thread 类建立多线程的方法。
2. 熟悉利用Runnable 接口建立多线程的方法。
二、实验原理
1. 通过继承Thread 类实现多线程的方法:
① 创建一个Thread 类的子类。
② 重写run 方法。
③ 创建这个子类的实例。
④调用子类的start 方法启动线程。
2. 通过Runnable 接口实现多线程的方法:
① 创建一个线程类,实现Runnable 接口。
② 实现run 方法。
③ 通过Thread 类中的Thread(Runnable) 构造方法创建一个线程类实例。
④ 调用线程类的start 方法启动线程。
三、实验内容
1. 阅读下列程序,分析并上机检验其功能。
class DelayThread extends Thread {
private static int count=0;
private int no;
private int delay;
public DelayThread() {
count++;
no=count;
}
public void run() {
try {
for (int i=0;i<10;i++){
delay=(int)(Math.random()*5000);
sleep(delay);
System.out.println(“Thread ”+no+” with a delay ”+delay);
} catch(InterruptedException e) { }
}
}
public class MyThread {
C++程序设计-实验5 多态
实验5 多态
一、实验目的
1.了解多态的概念。
2.了解虚函数的作用及使用方法。
3. 了解静态联编和动态联编的概念和方法。
4.掌握纯虚函数和抽象类的概念和方法。
二、实验准备
1.复习多态的概念。
2.理解虚函数在多态性的作用以及纯虚函数和抽象类的用法。
三、实验内容
1、某公司雇员(employee)包括经理(manager),技术人员(technician)销售员(saler)。要求:以employ类为基类派生出manager,technician和saler。
employee类的属性包括姓名、职工号、工资级别,月薪(实发基本工资加业绩工资)。操作包括月薪计算函数(pay()),该函数要求输入请假天数,扣去应扣工资后,得出实发基本工资。
technician类派生的属性有每小时附加酬金和当月工作时数,称业绩工资。也包括同名的pay()函数,工资总额为基本工资加业绩工资。
saler类派生的属性有销售总额,总额的10%作为业绩工资。工资总额为基本工资加业绩工资。
manager类派生的属性有固定奖金,固定奖金作为业绩工资。工资总额为基本工资加业绩工资。
编程实现工资管理。特别注意pay()的定义和调用方法:先用同名覆盖,再用运行时多态。
提示:给出基类的定义如下,请完成派生类的定义,并运用主函数测试运行时的多态。
#include<iostream>
#include <string>
using namespace std;
static int Grades[]={500,600,750,1000,1400,2000,2800,4000};
Java实验五线程
Java实验五线程
实验五线程
一实验要求
1、理解进程和线程概念;
2、掌握创建、管理和控制Java线程对象的方法;
3、了解并发执行的多线程存在的各种关系
二实验内容
1、使用线程对象或Timer定时器制作数字时钟标签组件,显示当前日期和时间,每秒刷新,将该标签添加到框架窗口。
import java.awt.FlowLayout;
import java.text.SimpleDateFormat;//简单日期格式类
import java.util.Locate;
import java.util.Timer;//一种工具,线程用其安排以后在后台线程中执行的任务
import java.util.TimerTask;
import java.swing.JLabel;
public class ShizhongJFrame extends JFrame{
{
Public ShizhongJFrame(){
JFrame f=new JFrame(“数字时钟”);
f.setLayout(new FlowLayout());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(200,70);
final JLable lable=new JLable;
final SimpleDateFormat format=new SimpleDateFormat(“H:m:s”,Locate.CHINA);
f.add(lable);
Timer time=new Timer();
实验五线程控制实验
void *(*start_rtn)(void *),
作用:创建一个线程
void *restrict arg);
返回值:出错返回错误码;成功返回0
实验五 | 实验原理 | 创建线程函数的参数
参数 tidp attr
Start_rtn arg
参数的意义 指向线程ID的指针,当函数成功返回时将存储所创建的子线程ID
无多线程,则程序等待玩家指令输入,程序的动画效果停止 •在线视频播放存在同样的问题
实验五 | 实验原理 | 创建线程
头文件:pthread.h
函数:int pthread_create(pthread_t *restrict tidp,
const pthread_attr_t *restrict attr,
缓冲区等
实验五 |线程的三种退出方式
线程的终止三种方式 ✓ 线程从启动例程函数中返回,函数返回值作为线程的 退出码 ✓ 线程调用pthread_exit函数终止自身执行 ✓ 线程被同一进程中的其他线程取消
实验五 | 实验原பைடு நூலகம் | 线程的终止
头文件:pthread.h 函数:void pthread_exit(void *rval_ptr); 作用:线程调用后将会终止自身 参数:rval_ptr指针将会传递给等待线程终止函数
用于指定所创建线程的属性(一般直接传入空指针NULL,表示线程属性
C语言程序设计实验五 参考答案
答案:
#include<stdio.h>
int f(int n)
{
if(n==1)
return n;
else
return n+f(n-1);
}
main( void)
{
int n;
scanf("%d",&n);
printf("%d\n",f(n));
*******************************************************************************************************实验六*************************************************
5-3、从键盘上输入一个整数n,计算n的立方,并将结果输出在屏幕上。要求计算n的立方用函数实现。
答案:
#include<stdio.h>
void main()
{
int a;
int sum(int n);
printf("input n:\n");
scanf("%d",&a);
sum(a);
printf("n*n*n=%d\n",sum(a));
实验5 线程创建与并发(A30)
属性,可赋值NULL;
第三个参数是线程将要启动执行的函数指针,即函数名; 第四个参数是要传递给该线程的参数的指针。
函数的返回值为0,表示创建成功,否则表示创建失败。
设计一个售票模拟系统进程,在其main函数中创建2 i■nptthrteicakde_t[_1e0x]i=t({)1函,3数,5,7,9,2,4,6,8,10}; p{ thprethadre_atd_t tid;tid; ①pri用ntf你(“O的v用er!户\n账”);号登录,并进入ostest目录。
实验五程序设计及其答案
实验五:程序设计(一)
一、实验目的
1.把握输入输出语句的利用。
2.把握利用if 语句实现选择结构的方式。
3.把握利用for 语句实现循环结构的方式。
4.把握利用while 语句实现循环结构的方式。
二、实验说明
一、熟练利用MATLAB 完成相关题目
二、实验学时:2学时
三、实验内容
一、Fibonacci 数组的元素知足Fibonacci 规那么:12+++=k k k a a a ,),2,1( =k ;且121==a a 。现要求该数组中第一个大于10000的元素。 二、依照
222221......3121116n
++++=π,求π的近似值。当n 别离取100、1000、10000时,结果是多少?
3、公鸡5元一只,母鸡3元一只,小鸡3只一元,100元买100只鸡,求各类鸡的数量。
4、编写一个乘法表(9 ×9 )。
四、实验要求
一、实验报告要求发送M文件
3、实验报告上交截止日期:2021/11\2答案:
1题:a(1)=1;a(2)=1;i=2;
while a(i)<=10000
a(i+1)=a(i-1)+a(i);
i=i+1;
end
2提:i,a(i)
s=0;
for i=1:100
s=s+1/i^2;
end
p=sqrt(6*s)
3提:%i表示公鸡数
%j表示母鸡数
%k表示3只小鸡的数
fang_an=0;
for i=1:20;
for j=1:30;
for k=1:33;
if i+j+3*k==100
if 5*i+3*j+k==100
fang_an=fang_an+1;
gj(fang_an)=i
实验五 多线程
实验五多线程
实验课程名:Java程序设计
一、实验目的和要求
①掌握使用Thread的子类创建线程;
②学习使用Thread类创建线程;
③学习处理线程同步问题。
二、实验内容
1.汉字打字练习。
✧实验要求:
编写一个Java应用程序,在主线程中再创建一个Frame类型的窗口,在该窗口中再创建1个线程giveWord。线程giveWord每隔2秒钟给出一个汉字,用户使用一种
汉字输入法将该汉字输入到文本框中。
✧程序模板:
WordThread.java
import java.awt.*;
public class WordThread extends Thread
{ char word;
int k=19968;
Label com;
WordThread(Label com)
{ =com;
}
public void run()
{ k=19968;
while(true)
{
word=(char)k;
com.setText(""+word);
try{
sleep(6000);//调用sleep方法使得线程中断6000豪秒
}
catch(InterruptedException e){}
k++;
if(k>=29968) k=19968;
}
}
}
ThreadFrame.java
import java.awt.*;
import java.awt.event.*;
public class ThreadFrame extends Frame implements ActionListener
{
Label wordLabel;
多线程编程练习
实验五:多线程编程练习
一、课堂范例的验证
二、打字游戏
编写一个基于Windows窗体的应用程序,使用多线程实现打字练习功能,在主线程里用Timer控件定时产生Label控件,每个Label控件显示一个随机产生的字母,每产生一个Label 就新开一个线程(辅助线程),这个线程用于控制Label控件的向下移动,主线程监视键盘输入,如果键盘输入文本与这个Label控件的Text相同,Label就消失
三、实现书本上128页上的练习6,7,8(至少3者选1)
四、模拟停车场
请以一个停车场的运作为例练习信号量的使用。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。如何来模拟这些车的动作。(界面可以是Console/WinForm)
提示:信号量semaphore是一个非负整数(车位数),所有通过它的线程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: Wait(等待)和 Release(释放)。当一个线程调用Wait(等待)操作时,它要么通过然后将信号量减一,要么一直等下去,直到信号量大于一或超时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,该操作之所以叫做“释放”是因为加操作实际上是释放了由信号量守护的资源。
实验五 多线程程序设计(汽院含答案)
实验五多线程程序设计
实验目的
1.掌握Java语言中多线程编程的基本方法
2.掌握Runnable接口实现多线程的方法
3.掌握Thread类实现多线程的用法
实验导读
1.进程和线程的概念
进程是程序一次动态执行的过程,对应从代码加载、执行到执行结束这样一个完整的过程,也是进程自身从产生、发展到消亡的过程。
线程是比进程更小的执行单元,一个进程在执行过程中,可以产生多个线程。每个线程都有自身的产生、执行和消亡的过程。
2.线程的状态与生命周期
●新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。此时它
已经有了相应的内存空间和其他资源。
●运行:线程创建之后就具备了运行的条件,一旦轮到它来享用CPU资源时,即JVM将CPU使用权
切换给该线程时,此线程的就可以脱离创建它的主线程独立开始自己的生命周期了(即run方法执行的过程)。
●中断:有4种原因的中断,CPU资源从当前线程切换给其他线程、执行了sleep(int millsecond)方法、
执行了wait()方法、进入阻塞状态。
●死亡:run方法结束。
3.线程的创建
在Java语言中,与线程支持密切相关的是ng.Thread类和ng.Runnable接口。Runnable接口定义很简单,只有一个run方法。任何一个类如果希望自己的实例能够以线程的形式执行,都可以来实现Runnable接口。
继承Thread类和实现Runnable接口,都可以用来创建Thread对象,效果上并没有什么不同。继承Thread 类的方法很明显的缺点就是这个类不能再继承其他的类了,而实现Runnable接口不会有这个麻烦。
C语言程序设计 实验五 数组 答案《西北民大 电气院》
实验五数组
一,实验目的:
1,掌握一维数组和二维数组的定义,赋值和输入输出的方法.
2,掌握字符数组和字符串函数的使用.
3,掌握与数组有关的算法(特别是排序算法).
二,实验准备:
1,复习数组的基本知识.
2,复习字符串数组的特点和常用的字符串处理函数.
3,源程序.
三,实验步骤及内容:
1,编程求两个3*3二维数组的和:
#include "stdio.h"
main()
{ int i,j,s=0,k=0,w=0;
int a[3][3]={{1,2,3},{1,2,3},{1,2,3}},b[3][3]={{4,5,6},{4,5,6},{4,5,6}}; for(i=0;i<3;i++)
for(j=0;j<3;j++)
{s=s+a[i][j];
k=k+b[i][j];
}
w=s+k;
printf("%d\n",w);
getch();
}
运行结果:
2,编程计算3*3矩阵两条对角线元素之和:
#include "stdio.h"
main()
{ int i,j,s=0,k=0,w=0;
int a[3][3];
for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(i+j==2||i==j)
k=k+a[i][j];
printf("%d\n",k);
getch();
}
运行结果:
3,编写下列问题的源程序并上机调试运行.
(1)用选择法对10个整数排序(10个整数用scanf函数输入).(习题6.2)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五多线程程序设计
实验目的
1.掌握Java语言中多线程编程的基本方法
2.掌握Runnable接口实现多线程的方法
3.掌握Thread类实现多线程的用法
实验导读
1.进程和线程的概念
进程是程序一次动态执行的过程,对应从代码加载、执行到执行结束这样一个完整的过程,也是进程自身从产生、发展到消亡的过程。
线程是比进程更小的执行单元,一个进程在执行过程中,可以产生多个线程。每个线程都有自身的产生、执行和消亡的过程。
2.线程的状态与生命周期
●新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。此时它
已经有了相应的内存空间和其他资源。
●运行:线程创建之后就具备了运行的条件,一旦轮到它来享用CPU资源时,即JVM将CPU使用权
切换给该线程时,此线程的就可以脱离创建它的主线程独立开始自己的生命周期了(即run方法执行的过程)。
●中断:有4种原因的中断,CPU资源从当前线程切换给其他线程、执行了sleep(int millsecond)方法、
执行了wait()方法、进入阻塞状态。
●死亡:run方法结束。
3.线程的创建
在Java语言中,与线程支持密切相关的是ng.Thread类和ng.Runnable接口。Runnable接口定义很简单,只有一个run方法。任何一个类如果希望自己的实例能够以线程的形式执行,都可以来实现Runnable接口。
继承Thread类和实现Runnable接口,都可以用来创建Thread对象,效果上并没有什么不同。继承Thread 类的方法很明显的缺点就是这个类不能再继承其他的类了,而实现Runnable接口不会有这个麻烦。
另外,在继承Thread类的代码中,this其实就是指当前正在运行的线程对象,如果使用实现Runnable 接口的方式,要得到当前正在执行的线程,需要使用Thread.currentThread()方法。
线程创建后仅仅是占有了内存资源,在JVM管理的线程中还没有这个线程,此线程必须调用start()方法(从父类继承的方法)通知JVM,这样JVM就会知道又有一个新一个线程排队等候切换了。
注意:多次启动一个线程,或者启动一个已经运行的线程对象是非法的,会抛出IllegalThreadStateException异常对象。
4.线程的优先级
同一时刻在等待队列中的线程会有很多个,它们各自任务的重要性有所不同。为了加以区分,使工作安排和资源分配时间更为合理,每个线程可以被赋予不同的优先级,让任务比较急的线程拥有更高的优先级,从而更快地进入执行状态。
Java中提供了10个等级的线程优先级,最低为Thread.MIN_PRIORITY=1,最高为
Thread.MAX_PRIORITY=10,默认优先级为Thread.NORM_PRIORITY=5。
使用Thread类中的setPriority(int)方法可以为线程指定优先级。
5.线程的常用方法
●start() 方法:
线程调用该方法将启动线程,使之从新建状态进入就绪队列排队,一旦轮到它来享用CPU资源时,就可以脱离创建它的线程独立开始自己的生命周期了。
●run()方法:
Thread类的run()方法与Runnable接口中的run()方法的功能和作用相同,都用来定义线程对象被调度之后所执行的操作,都是系统自动调用而用户程序不得引用的方法。系统的Thread类中,run()方法没有具体内容,所以用户程序需要创建自己的Thread类的子类,并重写run()方法来覆盖原来的run()方法。当run 方法执行完毕,线程就变成死亡状态。
●sleep(int millsecond) 方法:
现程占有CPU期间,执行sleep方法来使自己放弃CPU资源,休眠一段时间。休眠时间的长短由sleep 方法的参数决定,millsecond是毫秒为单位的休眠时间。如果线程在休眠时被打断,JVM就抛出InterruptedException异常。因此,必须在try~catch语句块中调用sleep方法。
●isAlive() 方法:
线程处于“新建”状态时,线程调用isAlive()方法返回false。当一个线程调用start()方法,并占有CUP资源后,该线程的run方法就开始运行,在线程的run方法结束之前,即没有进入死亡状态之前,线程调用isAlive()方法返回true。当线程进入“死亡”状态后(实体内存被释放),线程仍可以调用方法isAlive (),这时返回的值是false。
一个已经运行的线程在没有进入死亡状态时,不要再给线程分配实体,由于线程只能引用最后分配的实体,先前的实体就会成为“垃圾”,并且不会被垃圾收集机收集掉。
●currentThread() 方法:
currentThread()方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。
●interrupt() 方法:
intertupt方法经常用来“吵醒”休眠的线程。当一些线程调用sleep方法处于休眠状态时,一个占有CPU 资源的线程可以让休眠的线程调用interrupt 方法“吵醒”自己。
6.线程的同步
线程同步是指几个线程都需要调用一个同步方法(使用关键字synchronized修饰的方法) 。
当一个线程A使用一个synchronized修饰的方法时,其他线程想使用这个方法时就必须等待,直到线程A 使用完该方法(除非线程A使用wait主动让出CPU资源)。
一个线程在使用的同步方法中时,可能根据问题的需要,必须使用wait()方法使本线程等待,暂时让出CPU的使用权,并允许其它线程使用这个同步方法。其它线程如果在使用这个同步方法时如果不需要等待,那么它用完这个同步方法的同时,应当执行notifyAll()方法通知所有的由于使用这个同步方法而处于等待的线程结束等待。
●挂起:
有时候两个线程并不是同步的,即不涉及都需要调用一个同步方法,但线程也可能需要暂时的挂起。所谓挂起一个线程就是让线程暂时让出CPU的使用权限,暂时停止执行,但停止执行的持续时间不确定,因此不能使用sleep方法暂停线程。挂起一个线程需使用wait方法,即让准备挂起的线程调用wait 方法,主动让出CPU的使用权限.
●恢复:
为了恢复该线程,其它线程在占有CUP资源期间,让挂起的线程的目标对象执行notifyAll()方法,使得挂起的线程继续执行;如果线程没有目标对象,为了恢复该线程,其它线程在占有CUP资源期间,