学到了多线程的知识,在此记录一下
文章目录
目录
前言
学到了多线程的知识,了解到了多线程在java中的重要性和简单的应用,当然功能是为需求服务的,自然是因为现实生活中有多线程的需求,自然在编程语言中就有了对应的功能
一、关于进程
众所周知,多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。
二、线程实现
线程类继承实现
线程类接口实现
三、线程状态
线程状态
四、线程同步
线程同步
同步代码块
五、进程实验
实验内容:
使用线程的同步控制机制模拟设计一个多线程售票程序,要求通过点击图形界面上 的 “购票”按钮完成购票,并在 Label 中显示剩余票数 ,实现多窗口同时售票。
实验要求:
要求: 1、多线程实现同步控制 2、要求用窗体完成售票功能(界面内容可以自由创作)
实验代码:
//第一个版本,单线程版本
public class TicketWindow {
private String name;
private static int ticket=30;
public TicketWindow(){
super();
}
public TicketWindow(String name) {
super();
this.name = name;
}
public void saleTicket(){
while (ticket>0){
System.out.println(name+"正在卖第"+ticket+"张票。");
ticket--;
}
}
}/*
第二个版本:创建多线程的第一找个发方法,继承Thread类
1.继承Tread类
2.重写run方法
3.创建对象(继承自Trea)
4.调用start方法启动线程
*/
public class TicketWindowExtendsThread extends Thread{
private String name;
private static int ticket=100;
public TicketWindowExtendsThread(){
super();
}
public TicketWindowExtendsThread(String name) {
this.name = name;
}
@Override
public void run(){
while (true){
if(ticket>0){
System.out.println(name+"正在卖第"+ticket+"张票");
ticket--;
}
}
}
}
public class TestTicketWindow {
public static void main(String [] args){
TicketWindow w1=new TicketWindow("1号窗口");
TicketWindow w2=new TicketWindow("2号窗口");
TicketWindow w3=new TicketWindow("3号窗口");
w1.saleTicket();
w2.saleTicket();
w3.saleTicket();
}
}
/*
第二个版本:创建多线程的第一找个发方法,继承Thread类
1.继承Tread类
2.重写run方法
3.创建对象(继承自Trea)
4.调用start方法启动线程
*/
public class TicketWindowExtendsThread extends Thread{
private String name;
private static int ticket=100;
public TicketWindowExtendsThread(){
super();
}
public TicketWindowExtendsThread(String name) {
this.name = name;
}
@Override
public void run(){
while (true){
if(ticket>0){
System.out.println(name+"正在卖第"+ticket+"张票");
ticket--;
}
}
}
}
public class TestTicketWindow2 {
public static void main(String [] args){
TicketWindowExtendsThread w1=new TicketWindowExtendsThread("1号窗口");
TicketWindowExtendsThread w2=new TicketWindowExtendsThread("2号窗口");
TicketWindowExtendsThread w3=new TicketWindowExtendsThread("3号窗口");
w1.start();
w2.start();
w3.start();
}
}
/**
* 第三个版本:通过实现Runnable接口创建线程
* 1.写Runnable接口的实现类
* 2.重写run方法
* 3.创建实现类u第项
* 4.创建Threa类对象,通过构造方法实现类对象放进来
* 5.调用start方法开启线程
*/
public class TicketWindowImplRunnalbe implements Runnable{
static int ticket=100;
@Override
public void run(){
while (true){
if(ticket>0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println(Thread.currentThread().getName()+"正在售卖第"+ticket+"张票。");//当前线程
ticket--;
}
}
}
}
public class TestTicketWindow3 {
public static void main(String [] args){
TicketWindowImplRunnalbe w1=new TicketWindowImplRunnalbe();
TicketWindowImplRunnalbe w2=new TicketWindowImplRunnalbe();
TicketWindowImplRunnalbe w3=new TicketWindowImplRunnalbe();
Thread t1=new Thread(w1);
Thread t2=new Thread(w1);
Thread t3=new Thread(w1);
t1.start();
t2.start();
t3.start();
}
}
public class TicketWindowUseSy extends Thread{
private static int ticket = 100;
static Object obj = new Object();
public void run() {
while(true) {
synchronized(obj) {
if(ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票。");
ticket--;
}
}
}
}
}
public class TestTicketWindow4 {
public static void main(String[] args) {
// TODO Auto-generated method stub
TicketWindowUseSy w1 = new TicketWindowUseSy();
TicketWindowUseSy w2 = new TicketWindowUseSy();
TicketWindowUseSy w3 = new TicketWindowUseSy();
w1.start();
w2.start();
w3.start();
}
}
实验结果截图:
总结
以上就是对于入门进程的一点记录,通过从单线程到多线程,从不断出小错误到基本没有问题,在一个迭代的过程中学到了很多。