android线程的初学探究

近日老师要求用程序模拟操作系统的进程调度过程,我使用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();
                        }
发布了17 篇原创文章 · 获赞 7 · 访问量 2995

猜你喜欢

转载自blog.csdn.net/znevegiveup1/article/details/84994179
今日推荐