项目并不完美,借鉴需考量
( 满满干货)简单由实例讲解多线程和GUI
文末附有源码(下载链接)
1、项目介绍:
操作系统课设项目,题目是设计一个能够实现多种页面置换算法同时执行且能够暂停以及终止算法置换展示(动态展示),要想要实现同时执行,就需要程序多线程并发执行,Java对多线程编程有很好的帮助,所以我用Java。
2、程序界面截图
还有一张结果清单,就是将点击保存的结果序列(以 第i组 逻辑序列 物理序列 的形式三行一组的显示),但是我忘记截图了,那就不截了。
3、项目难点以及知识点(枚举的。。。。)
GUI方面
1、JFrame类,一些控件的使用,几大布局来控制界面。
2、内部监听器类,用来判断点击事件并执行相应的代码(继承ActionListener类)。
3、Java作为面向对象语言,可以把布局代码写在构造函数中,然后主函数中实例化,这样就可以让代码更规整,且一旦打开java程序就立刻产生界面。
4、一定要注意,一个java程序还未执行,当前界面不能对它里面的任何东西进行操作(之前我想要将第二张图中的序列放到第三张的显示区中,但是总是报错空指针,后来我改思路,让下一页从上页获取,而不是上一页设置下一页的文本框的值)。
5、设置按钮的逻辑关系(初始化、开始、暂停、继续、保存)。
多线程部分
1、线程的编写(两种方法,我用了其中之一):继承Runnable接口,重写run()函数,这个run函数里面写线程的工作代码。
2、线程的调用:实例化线程类,创建对应的线程对象,然后 tt1.start()来启动线程。
3、线程的暂停、继续,通过改变boolean型变量的值以及wait()和notify()
来实现(每个线程类中设置控制资源时需要变量名以及内容都不同,别问为什么,我也不知道,自己试出来的,可以查百度)还有java把线程的很多容易发生事故的操作都废除了,只有用这种方法。
4、线程的终止,用变量控制,我这里直接通过改变bool变量的值来台跳出循环体,使程序提前结束。
5、其他类怎么控制上两条提到的线程中的变量,用私有成员,并添加get和set方法(请思考web项目中的po实体类怎么写的)。
4、源代码
GUI
第一张图
package reqPage;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.xml.bind.Marshaller.Listener;
/**
* 功能:学生成绩管理系统
* 步骤1、登录界面的静态实现
* author:ywq
*/
import java.awt.*;
import javax.swing.*;
public class prinMain extends JFrame{
//定义组件
JPanel jp1,jp2,jp3,jp4,jp5,jp6;//面板
JLabel jlb1;//标签
JLabel jlb2;
JLabel jlb3;
JLabel jlb4;
JLabel jlb5;
JButton jb1,jb2;//按钮
static JTextField jtf1;//逻辑页数
static JTextField jtf2;//物理页数
static JTextField jtf3;//快表时间
static JTextField jtf4;//慢表时间
static JTextField jtf5;//缺页中断处理时间
public static void main(String[] args) {
prinMain win=new prinMain();
}
//设置只能输入数字
public void myset(JTextField jtf1) {
jtf1.addKeyListener(new KeyAdapter() {
@Override
public void keyTyped(KeyEvent e) {
int temp = e.getKeyChar();
if(temp == 10){
}//按回车时
if(temp==46)
{
e.consume();
}
else{
//没有按小数点时
if(temp != 8){
//没有按backspace时
//下面检查是不是在0~9之间;
if(temp > 57){
e.consume(); //如果不是则消除key事件,也就是按了键盘以后没有反应;
}else if(temp < 48){
e.consume();
}
}
}
}
});//!!!!!!!!!!!
}
//构造函数
public prinMain(){
//创建面板
super("请求分页管理系统");
jp1=new JPanel();
jp2=new JPanel();
jp3=new JPanel();
jp4=new JPanel();
jp5=new JPanel();
jp6=new JPanel();
//创建标签
jlb1=new JLabel(" 输入页面个数");
jlb2=new JLabel(" 输入页框个数");
jlb3=new JLabel("访问快表时间(ns)");
jlb4=new JLabel("访问页表时间(ns)");
jlb5=new JLabel("中断处理时间(ns)");
//创建按钮
jb1=new JButton("恢复默认");
jb2=new JButton("下一步");
//创建文本框
jtf1=new JTextField("8",10);
jtf2=new JTextField("3",10);
jtf3=new JTextField("10",10);
jtf4=new JTextField("100",10);
jtf5=new JTextField("1000",10);
//设置只能输入数字
myset(jtf1);
myset(jtf2);
myset(jtf3);
myset(jtf4);
myset(jtf5);
//在构造函数中实例化监听器,然后向按钮添加这个监听器
myaction act=new myaction();
jb1.addActionListener(act);
jb2.addActionListener(act);
//设置布局管理
this.setLayout(new GridLayout(6, 1));//网格式布局
//加入各个组件
jp1.add(jlb1);
jp1.add(jtf1);
jp2.add(jlb2);
jp2.add(jtf2);
jp3.add(jlb3);
jp3.add(jtf3);
jp4.add(jlb4);
jp4.add(jtf4);
jp5.add(jlb5);
jp5.add(jtf5);
jp6.add(jb1);
jp6.add(jb2);
//加入到JFrame
this.add(jp1);
this.add(jp2);
this.add(jp3);
this.add(jp4);
this.add(jp5);
this.add(jp6);
//设置窗体
this.setSize(500, 350);//窗体大小
this.setLocationRelativeTo(null);//在屏幕中间显示(居中显示)
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出关闭JFrame
this.setVisible(true);//显示窗体
//锁定窗体
this.setResizable(false);
}
//建完监听器内部类之后,要实例化它才能用,在构造函数中实例化,等主类实例化调用构造函数时执行
class myaction implements ActionListener{
//继承监听器接口,然后改写下面这个方法,来实现点击事件行为
String str1;
int s1;
String str2;
int s2;
public void actionPerformed(ActionEvent e){
if((JButton)e.getSource()==jb2) {
str1=jtf1.getText().toString();
s1=Integer.parseInt(str1);
str2=jtf2.getText().toString();
s2=Integer.parseInt(str2);
if(s2>7||s1<s2||s1>20) {
JOptionPane.showMessageDialog(null,"页框数建议不能大于8且不能超过页面数!,页面数不能超过20个!!", "请重新输入" , JOptionPane.WARNING_MESSAGE);
}
else
{
setVisible(false); //不用加this
//dispose();//本窗口销毁,释放内存资源
new prinNext();//打开新的窗体
}
}
else if((JButton)e.getSource()==jb1) {
jtf1.setText("8");
jtf2.setText("3");
jtf3.setText("10");
jtf4.setText("100");
jtf5.setText("1000");
}
}
}
}
第二张图
package reqPage;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class prinNext extends JFrame {
JPanel jp1,jp2,jp3;
JButton jbBack,jbRandom,jbPrint;
static JButton jbAll;
static JTextField jtFou;
JLabel jl1;
//(实例化不能放在构造函数里,每次new都会调用一次构造函数!!!!)
static String[][] ru=new String[10][3];//用来存结果
static int prinNum=0;//用来存数组ru中的数量
public prinNext() {
super("请求分页管理系统");
jp1=new JPanel();
jp2=new JPanel();
jp3=new JPanel();
jbBack=new JButton("上一步");
jbRandom=new JButton("获取随机访问序列");
jbAll=new JButton("下一步");
jtFou=new JTextField(40);
jbPrint=new JButton("程序结果清单");
jl1=new JLabel("输入访问序列");
jp1.add(jl1);
jp1.add(jtFou);
jp1.add(jbRandom);
jp3.add(jbPrint);
jp2.add(jbBack);
jp2.add(jbAll);
myaction act=new myaction();
jbBack.addActionListener(act);
jbRandom.addActionListener(act);
jbAll.addActionListener(act);
jbPrint.addActionListener(act);
this.setSize(800,200);
this.setLayout(new GridLayout(3,1));//*****
this.add(jp1);
this.add(jp3);
this.add(jp2);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setLocationRelativeTo(null);//在屏幕中间显示(居中显示)
this.setVisible(true);
this.setResizable(false);//锁定窗口
String p=prinMain.jtf1.getText().toString();
int p1=Integer.parseInt(p);
System.out.printf("text:"+p1);
}
class myaction implements ActionListener {
//封装点击方法
public void clock(int p1) {
int count=0;int flag3=1;
String []list=new String [100];
//获取文本框中的文本
String tf_str = jtFou.getText().trim();
String[] t=tf_str.split(",");
String[]check=new String[] {
"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f",","};
int flag2=0;
//将文本交给文本框
//ta.setText(tf_str);
//追加文本
for (int i = 0; i <t.length; i++) {
System.out.println(t[i].length());
if(t[i].length()!=5) {
JOptionPane.showMessageDialog(null,"输入五位地址位以 ,结束", "请重新输入" , JOptionPane.WARNING_MESSAGE);flag3=0;
i--;break;
// tf.setText("");
}
for(int j=0;j<5;j++) {
String a=t[i].substring(j,j+1);
list[count]=a;
count++;
}
}
if(t.length!=p1) {
JOptionPane.showMessageDialog(null,"输入个数不合法", "请重新输入" , JOptionPane.WARNING_MESSAGE);flag3=0;};
int []flag=new int[count] ;
for (int m = 0; m < count; m++) {
flag[m]=0;
}
for(int i=0;i<count;i++) {
for (int j = 0; j < 17; j++) {
if(list[i].equals(check[j])) {
flag[i]=1;break;}
}
}
for(int i=0;i<count;i++) {
for (int k = 0; k < count; k++) {
if(flag[k]==0) {
JOptionPane.showMe