一、学习总结
进程与线程
● 进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到最终消亡的过程。
● 多线程是实现并发机制的一种有效手段。进程和线程一样,都是实现并发的一个基本单位。
Java中线程的实现
● 在Java中要实现多线程代码的两种手段:
● 继承Thread类
● 实现Runnable接口
启动线程
线程的主要代码是在run方法里写的,但是启动的时候是调用Thread的start方法启动。
Thread类和Runnable接口的区别
● 实际上Thread类和Runnable接口之间在使用上也是有所区别的,如果一个类继承Thread类,则不适合于多个线程共享资源,而实现了Runnable接口,则可以方便的实现资源的共享。
线程的状态
● 要想实现多线程,必须在主线程中创建新的线程对象。任何线程一般具有五种状态,即创建、就绪、运行、阻塞、终止。
线程操作的主要方法
取得和设置线程名称;
● 在Thread类中,可以通过getName()方法取得线程的
名称,通过setName()方法设置线程的名称。
● 线程的名称一般在启动线程前设置,但也允许为已经运
行的线程设置名称。允许两个Thread对象有相同的名字,但为了清晰,应该尽量避免这种情况的发生。
● 另外,如果程序并没有为线程指定名称,则系统会自动的为线程分配-一个名称。
判断线程是否启动
● 通过Thread类之中的start()方法通知CPU这个线程己经准备好启动,之后就等待分配CPU资源,运行此线程了。那么如何判断一个线程是否已经启动了呢?在Java中可以使用isAlive()方测试线程是否已经启动而且仍然在启动。
线程的强制运行
● 在线程操作中, 可以使用join()方法让一个线程强制运行,线程强制运行期间,其他线程无法运行,必须等待此线程完成之后才可以继续执行。
线程的休眠
● 在程序中允许一个线程进行暂时的休眠,直接使用Thread.sleep()方法即可。
中断线程
● 当一个线程运行的时候,另外一个线程可以直接通过interrrupt()方法,中断其运行状态。
线程了礼让
● 在线程操作中,也可以使用yield()方法将一个线程的操作暂时让给其他线程执行。
同步代码块
● 在代码块上加上“synchronized"关键字的话,则此代码块就称为同步代码块。
● 代码块格式:
synchronized(同步对象){
需要同步的代码;
}
二、实验报告
实验任务详情:
完成火车站售票程序的模拟。
要求:
(1)总票数1000张;
(2)10个窗口同时开始卖票;
(3)卖票过程延时1秒钟;
(4)不能出现一票多卖或卖出负数号票的情况。
package com.company;
public class Market implements Runnable{
private int ticket;
public int getTicket() {
return ticket;
}
void setTicket(int ticket) {
this.ticket = ticket;
}
public void run() {
for(int i=1;i<100;i++) {
synchronized (this) {
if (ticket > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticket--;
System.out.println(Thread.currentThread().getName() + "卖票成功;" +"余票:"+ticket);
}
}
}
}
}
package com.company;
public class Test3 {
public static void main(String[] args){
Thread[] t=new Thread[10];
Market mar=new Market();
mar.setTicket(1000);
for(int i=0;i<10;i++){
new Thread(mar,i+1+"窗口").start();
}
}
}