概念:

  操作系统可以有多个进程,一个线程可以有一个或多个线程。进程与进程之间不共享内存,都在各自的空间中运行。而线程不仅可以共享内存,还可以用有一个自己的内存空间,叫做线程栈。

  线程又称轻量级进程。Java的线程是靠CPU时间片的快速切换实现的,并不是真正的同时进行。每个线程有独立的线程栈和程序计数器。线程在自己的栈中存储变量,使数据互不干扰,对于共同资源,容易引发并发问题,需要同步处理。

创建线程常用的两种方式:

  1、继承Thread类,重写run()

  2、实现Runnable接口

线程生命周期:创建--就绪--运行--阻塞--死亡

note:

  1、线程的调度基于时间片基础上的优先级优先原则,注意即使setPriority()也不一定完全按照顺序执行

  2、线程进入Runnable(可运行状态,就绪状态),并不意味着它立即执行。

jion:调用其它线程。当前线程调用其它线程的jion()方法,使自己进入中断状态,必须等待调用的线程执行完,才能进入就绪状态(并不立即运行)。

code:

public class Test {

    public static void main(String[] args) {
        MyThread m = new MyThread();
        Thread t = new Thread(m);
        t.start();
        int i=0;
        while(i++<100){
            if(i==50){
                try {
                    t.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("main:"+i);
        }
    }
}
class MyThread implements Runnable{
    int i=0;
    public void run() {
        while(i++<50){
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("my thread: "+i);
        }
    }

}

yield: 暂停当前线程,yield() 为静态方法,功能是暂停当前正在执行的线程对象,并执行其他线程。当前线程变为就绪状态,也就是说某线程调用yield()方法后可能还运行此线程(表现为未暂停)(仅个人看法,尚未看到哪里有对此的说明,可能存在误解)。

code:

public class Test { 

    public static void main(String[] args) {
        Thread t1 = new MyThread();
        t1.start();
        for(int i=0; i<100; i++){
            System.out.println(i);
        }
    }
}
class MyThread extends Thread {
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("MyThread"+i );
            Thread.yield();
        }
    }
} 

interrupt: 中断线程。将会设置该线程为中断状态,即设置为true。线程会不时地检测这个中断标识位,以判断线程是否应该被中断。线程可以调用另外一个线程的interrupt方法,这将向暂停的线程发出一个InterruptedException。

isinterrupted:判断线程是否中断,不会清除中断状态

interruped:返回线程上次的中断状态,并清除中断标志位,即重新设置为false

结束线程方式:

1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。

2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。

3.  使用interrupt方法中断线程。(中断不会结束线程,但可以利用异常处理是线程结束)

哪些操作可以使线程进入阻塞状态?

  Jion()、yield 、wait() 、sleep()、I/O

最新文章

  1. 使用Selector改变TextView的字体颜色textColor的方法
  2. TextView中的部分文字响应点击事件
  3. Ionic常用命令行解释
  4. TOJ 1191. The Worm Turns
  5. 在 AndroidStudio 中添加和使用 Support Library
  6. javascript中this指向
  7. php文件上传进度条例子
  8. 【bzoj2460】 BeiJing2011—元素
  9. CocoStudio基础教程(2)关联程序逻辑与cocoStudio导出文件
  10. Monkey类、People类和主类 E。
  11. ubuntu 更新重启后 登录后 无法进入图形界面
  12. node-webkit
  13. demo_01 css3中的radius
  14. jquery知识 属性 css
  15. DLL模块:C++在VS下创建、调用dll
  16. css中的@inport 与link
  17. Linux安装Kafka
  18. String Method的字符串变换的一个例子
  19. abap对象的创建和调用。方法调用
  20. MySQL5.7的安装(CentOS 7 &amp; Ubuntu 16.04)

热门文章

  1. Elasticsearch安装ik中文分词插件(四)
  2. intellij idea 生成UUID
  3. ubuntu下update-alternatives命令的使用
  4. 【IE6的疯狂之十二】一个display:none引起的3像素的BUG
  5. openstack私有云布署实践【16.3 Windows Server2008 R2 只有C盘分区镜像制作】
  6. CentOS7 安装 OpenSSL 1.0.1m 和 OpenSSH 6.8p1
  7. CodeForces 710A King Moves
  8. 《C++反汇编与逆向分析技术揭秘》——函数的工作原理
  9. Payload Inject And Fake
  10. git出错