线程笔记

原创 2007年09月30日 23:34:00
  Java 虚拟机采用抢占式调度模型,是指优先让可运行池中优先级高的线程占用CPU,如果可运行池中线程式的优先级相同,那么就随

机选择一个线程,使其占用CPU.处于运行状态的线程式会一直运行,直到它不得不放弃CPU.


  值得注意的是,线程的调度不是跨平台的,它不仅取决于Java虚拟机,还依赖于操作系统.在某些系统中,只要运行中的线程没有遇到

阻塞,就不会放弃CPU;在某些系统中,即使运行中的线程没有遇到阻塞,也会在运行一定时间后放弃CPU,给其他线程运行的机会.



  如果希望明确地让一个线程给另一个线程运行的机会,可以采取以下方法之一:

1.调整各个线程的优先级.

2.让处于运行状态的线程调用Thread.sleep()方法.

3.让处于运行状态的线程调用Thread.yield()方法.

4.让处于运行状态的线程调用另一个线程的join()方法.


  值得注意的是,尽管Java提供了10个优先级,但它与多数操作系统都不能很好地映射.比如Windows 2000有7个优先级,并且不是固定
的,而SUN公司的Solaris操作系统有2的31次方个优先级.如果希望程序能移植到不同的平台中,应该确保在设置线程的优先级时,只使

用MAX_PRIORITY.NORM_PRIORITY.MIN_PRIORITY这三个优先级.这样才能保证在不同的操作系统中,对同样优先级的线程式采用同样的

调试方式.

  一个线程创A建了另一个线程B,则线程B的优先级就和线程A的优先级是一样的,比如主线程创建了另一个线程,则这个被创建的线程

式的优先级就和主线程的优先级是一样的.

下面是一个例子:


public class Machine extends Thread{
 
    public void run()
    {
        for(int a=0;a<3;a++)
        {
            System.out.println(currentThread().getName()+":"+a);
            /*if(a==1 && currentThread().getName().equals("m1"))
                throw new RuntimeException("Wrong from Machine");
            try
            {
                sleep(100);
            }
            catch(InterruptedException e)
            {
                throw new RuntimeException(e);
            }*/
        }
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
         Machine m=new Machine();
         m.setName("m1");
        
         Thread main=Thread.currentThread();
         System.out.println("the main thread's priority is:"+main.getPriority());
         m.start();
         System.out.println("the default priority is:"+m.getPriority());
         m.setPriority(MIN_PRIORITY);
         System.out.println("the min priority is:"+m.getPriority());
         //m.run();
         //System.out.println("Is machine alive "+m.isAlive());
         //System.out.println("main:end");
    }

}


   线程中sleep()方法和yeild()方法的主要区别:

1.sleep()方法会给其他线程运行的机会,而不管其他线程的优先级,因此会给较低优先级的线程运行的机会;yeild()方法只会给优先

  级相同的或者比自己高的线程运行的机会.

2.sleep()方法声明抛出InterruptionException异常,而yeild()方法没有声明抛出任何异常.

3.sleep()方法比yeild()方法具有更高的可移植性.

4.sleep()方法使线程进入阻塞状态,而yeild()方法使线程进入就绪状态.


  当前运行的线程可以调用另一个线程的join()方法,当前运行的线程将转到阻塞状态,直到另一个线程运行结束,它才会恢复运行.

  join()有两种形式:public void join()和public void join(long timeout)可以设置阻塞的时间.



  使用setDaemon()方法可以将线程设置成后台线程,使用isDaemon()方法则可以判断线程是否是后台线程.

  使用后台线程应该注意:

1. Java虚拟机只保证当前所有前台线程结束时,所有后台线程也会结束,而不保证后台线程一定是在前台线程结束后结束.

2.只有在线程启动前(即调用start()方法前),才能把它设置成后台线程.如果线程启动后,再调用这个线程的setDaemon()方法,则会抛

出异常.

3.由前台线程创建的线程在默认情况下仍然的前台线程,由后台线程创建的线程仍然是后台线程.






 

Java多线程笔记总结

1.线程的三种创建方式参考之前的总结: 多线程-创建线程的三种方式对比三种方式: 通过继承Thread类实现 通过实现Runnable接口 实现Callable接口 第1种方式无法继承其他类,第2,3...
  • neven7
  • neven7
  • 2015年12月22日 10:05
  • 649

Java笔记 - 线程基础知识

进程是一个执行中程序的实例,是操作系统进行资源分配和调度的一个独立单元。线程是进程中一个单一的程序控制流,是 CPU 调度和分派的基本单元。进程在执行时拥有独立的内存空间,进程中的线程可以共享进程的内...
  • yanshazi
  • yanshazi
  • 2016年04月05日 13:01
  • 2339

[读书笔记]多线程学习笔记

几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个执行流就是一个线程。线程和进程所有运行中的任务通常对...
  • CodeEmperor
  • CodeEmperor
  • 2016年02月07日 12:12
  • 942

操作系统概念学习笔记 9 线程

操作系统概念学习笔记 9线程概述单个进程可以包括多个控制线程。线程 ——一种CPU利用的基本单元,它是形成多线程计算机的基础。线程是CPU使用的基本单元,它由线程ID、程序计数器、寄存器集合和栈组成。...
  • sunmc1204953974
  • sunmc1204953974
  • 2015年05月12日 08:14
  • 1983

笔记-Java线程概述

Java Concurrency in Practice中对线程安全的定义:当多个线程访问一个类时,如果不用考虑这些线程在运行时环境下的调度和交替运行,并且不需要额外的同步及在调用方代码不必做其他的协...
  • zhmkof
  • zhmkof
  • 2016年02月18日 15:46
  • 240

毕向东笔记摘抄之多线程

进程:是一个正在执行的程序。 每一个进程都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。线程:就是进程中的一个独立的控制单元。 线程在控制着进程的进行。一个...
  • dada_6666
  • dada_6666
  • 2016年11月16日 11:30
  • 195

java个人笔记之线程

java线程
  • qq_32933131
  • qq_32933131
  • 2017年03月16日 20:16
  • 135

多线程笔记总结

多线程笔记总结1、Java中如果我们自己没有产生线程,那么系统就会给我产生一个线程(主线程,main方法就是在主线程上运行),我们的程序都是由线程来执行的。 2、进程:执行中的程序(程序是静态的概念、...
  • nicewuranran
  • nicewuranran
  • 2016年04月07日 15:00
  • 379

Java多线程(全)学习笔记(上)

资源下载地址:http://download.csdn.net/detail/cloudyxuq/3763101 一.线程的创建和启动 java使用Thread类代表线程,所有的线程对象都必须是T...
  • Cloudyxuq
  • Cloudyxuq
  • 2011年11月06日 21:07
  • 8201

线程属性(多线程编程笔记)

线程属性前篇介绍了使用缺省属性创建线程的基本原理。本章论述如何在创建线程时设置 属性。 注– 只有pthreads 使用属性和取消功能。本章中介绍的API 仅适用于POSIX 线程。除此 之外,...
  • viewsky11
  • viewsky11
  • 2016年12月01日 14:53
  • 747
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:线程笔记
举报原因:
原因补充:

(最多只允许输入30个字)