近日老师要求用程序模拟操作系统的进程调度过程,我使用Android来完成该项大作业,当中的种种心得体会总结于此。
第一是关于线程加锁的问题
这里我为了使得每一个线程可以依次执行,通过线程的睡眠时间不同
num为当前的线程数字,第一个线程睡0毫秒,第二个线程睡一毫秒,第三个线程睡两毫秒,以此类推,通过睡眠时间的不同来使每个线程的起始运行时间不同,这里需要注意的是对于主线程的睡眠一定要在线程加锁之前,也就是synchronized之前,否则线程已经拿到锁了,而这时多个线程的运行先后顺序是未知的,不能保证第一个线程先运行,然后第二个线程再接着运行
try {
Thread.currentThread().sleep(100*(num-1));
} catch (InterruptedException e) {
e.printStackTrace();
}
//保证线程依次运行
Log.e("mm","成功");
synchronized (this) {
//线程加锁后的内部逻辑
}
2.第二个问题是关于android文件读取的问题,不多说直接上代码
if (et_folder.getText().toString().trim().equals("")) {
Toast.makeText(getApplicationContext(), "输入为空",
Toast.LENGTH_SHORT).show();
} else {
//获得SD卡根目录路径 "/sdcard"
File sdDir = Environment.getExternalStorageDirectory();
//根目录下某个txt文件名
File path = new File(sdDir + File.separator
+ et_folder.getText().toString().trim());
// 判断SD卡是否存在,并且是否具有读写权限
if (Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED)) {
getFileContent(path);
runs();
}
3.android对于线程有保护机制,所以android中的ui必须在主线程执行,所以当你进行到了android内部线程的时候,再次运行需要再开新的线程,相当于更新主线程,我使用的是一种较为简易的更新界面的方式,话不多说,直接上代码。
this.runOnUiThread(new Runnable() {
//开启一个新的ui线程并且在内部更新
@Override
public void run() {
String text = readyqueue.getText().toString();
text = text.replace(readys[num]+"\n","");
readyqueue.setText(text);
}
});
4.关于阻塞的写法,阻塞其实本质就是解锁,之前我通过查阅资料理解到通过wait可以放锁,让其他进程运行,android线程的这一操作就可以很好的模拟阻塞过程中的放锁过程
try {
this.wait(waits*100);
} catch (InterruptedException e) {
e.printStackTrace();
}
5.关于线程的建立,我建了这样的一个类
class threads extends Thread {
private int num;
private int processSize;
public void setProcessSize(int processSize)
{
this.processSize = processSize;
}
public void setNumber(int num) {
this.num = num;
}
@Override
public void run() {
operate(num,processsize);
}
}
其中operate函数中实现线程阻塞加锁的种种过程
6.关于线程
try {
this.wait(waits*100);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
Thread.currentThread().sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
睡眠时间的写法
try {
this.wait(waits*100);
} catch (InterruptedException e) {
e.printStackTrace();
}
等待的写法
try {
this.wait(waits*100);
} catch (InterruptedException e) {
e.printStackTrace();
}