Android Java 并发程序系列----你应该知道的线程一

来源:互联网 发布:陕师大网络远程教育 编辑:程序博客网 时间:2024/06/05 11:14

1.基本概念:(个人理解不代表真理)
①进程是线程的容器
②程序是指令,数据,及其组织形式的描述
③进程是程序的实体
④线程是具体任务的执行单元

2.线程的基本操作

①开启一个线程

 new Thread().start();//不要 new Thead().run();  这样是不会开启一个线程的 只是执行一个普通方法

②再开启一个线程:
我们知道线程是执行单元,那么具体任务我们一般是用 Runnable来表示的 ;我们一个任务可以多个线程执行;

        Runnable task = new Runnable() {            @Override            public void run() {                //任务具体                  }        };        new Thread(task).start();        new Thread(task).start();        new Thread(task).start();

③停止一个线程
stop():这是Java提供给我们的方法,虽然是官方提供,但是官方并不推荐我们使用;
这里我们简单说下为什么:stop是强制停止一个线程,并不管任何事情,现在A线程对资源P进行读操作,B线程对资源P进行写操作,如果B写入一半的时候,被stop,而A又去对P进行读取,那么这个时候读取到的数据肯定就是一个坏掉的数据,并且这种错误是很难发现的。
下面给出代码重现这个情景:

    static final User user = new User();    public static void main(String[] args) {        new Thread(read).start();        while (true) {            Thread thread = new Thread(write);            thread.start();            try {                Thread.sleep(150);            } catch (InterruptedException e) {                e.printStackTrace();            }            thread.stop();        }    }static Runnable write = new Runnable() {            @Override            public void run() {                synchronized (user) {                    //任务具体                    long currentTimeMillis = System.currentTimeMillis() / 1000;                    user.name = String.valueOf(currentTimeMillis);                    try {                        Thread.sleep(100);//为了使错误率提高点                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                    user.twoName = String.valueOf(currentTimeMillis);                }                Thread.yield();            }        }; static Runnable read = new Runnable() {            @Override            public void run() {                //任务具体                    while (true) {                        if (!user.name.equals(user.twoName)) {                            System.out.println(user.toString());                        }                        Thread.yield();                }            }        };    static class User {        String name = "";        String twoName = "";        @Override        public String toString() {            return "User{" +                    "name='" + name + '\'' +                    ", twoName='" + twoName + '\'' +                    '}';        }    }

④ 再停止一个线程
我们正确停止一个线程的方法应该是有一个标记位,在线程结束的时候通过标记位结束线程,具体请看下面代码,这样才能保证线程结束会在可控制范围,而不会直接就中断出去了。特别值得注意的就是:如果一个线程抛出了一个异常(当然是你已经捕获的异常,要不然直接crash就不考虑了),会重置标记位,那么这个时候你应该在捕获到异常的时候再次调用interrupt()方法。

        Runnable tastk = new Runnable() {            @Override            public void run() {                //任务具体                    while (true) {                        if (Thread.currentThread().isInterrupted()) {                            System.out.println("线程执行中。。。");                            break;                        }                        Thread.yield();                }                System.out.println("线程即将结束");            }        };        Thread thread1 = new Thread(tastk);        thread1.start();        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }        thread1.interrupt();

今天就先说到这里吧,关于线程想要说的有点多,我还需要整理整理。。。只能慢慢来了,一点点来了,说多了,估计你也不爱看。。。嘿嘿,恩,这才是最主要的。。。

0 0
原创粉丝点击