构造线程类的方法:通过构造类java.lang.Thread的子类,另一种是通过构造实现接口java.lang.Runnable的类;前者即使后者的一个实现。
编写线程程序
通过类java.lang.Thread的子类构造线程(类java.lang.Thread的每个实例对象就是java的一个线程)。构造java.lang.Thread子类的主要目的是为了让线程类的实例对象能完成线程程序所需要的功能。编写子类的时候需要覆盖掉父类的run方法,在run()方法中包含线程所要执行的代码。public void run();启动或者运行线程调用类java.lang.Thread的start()方法。
public static void sleep(long milis) throws InterruptedException 该成员方法使得当前的线程进入睡眠状态。睡眠的时间由sleep的参数决定,由于成员sleep会抛出异常,所以需要进行异常处理。
public static double random() 返回一个大于0且小于1的随机数。
通过接口java.lang.Runnable构造线程,因为java构造线程是在构造过程中可能出现的多种继承的一种解决方案。
一般语法:
public class A extends B implements Runnable(){
//类的其他部分
public void run(){成员方法run的方法体}//类的其他部分}
extends B 非必需,视情况而定。
使用实现java.lang.Runnable接口的A后,构造和启动线程的方法是:
A a = new A(); Thread t = new Thread(a); t.start();
类java.lang.Thread的构造方法:public Thread(Runnable target);用这个方法构造类java.lang.Thread的实例化对象。
然后通过public void start()启动创建的新线程。
后台线程(又称为守护线程或者精灵线程):只有后台线程运行时,程序就会退出。默认线程是用户线程,可以通过类java.lang.Thread的成员方法public final boolean isDaemon()来判断一个线程是用户级线程还是后台线程。是后台,则返回true;不是则为false。可以把线程在用户线程和后台线程进行切换,通过类java.lang.Thread的方法:
public final void setDaemon(boolean on) 此方法必须在public void start()调用之前,否则将会在运行时出现java.lang.IllegalThreadStateException类型异常。若setDeamon的参数为true,置为后台线程,else 为用户线程。
线程组
线程可以通过线程组来进行管理,线程组是指一些线程和线程组的集合。线程组形成了一个树状的体系结构,除了树状根部的线程组之外,每个线程组都有一个父线程组。一个线程的父线程组就是包含了该线程组的线程组。
构造线程组可以用类java.lang.ThreadGroup的两个构造方法。
1.public ThreadGroup(String name),name用来指定线程组的名称。这时所构造出来的线程组是当前线程所在的线程组。
2.public ThreadGroup(String parent,String name)parent指父线程组,name指新构造出来的线程组。
将一个线程添加到一个线程组中一般是在创建线程时通过线程的构造方法的参数指定线程组,例如,类java.lang.Thread的构造方法 public Thread(ThreadGroup group,String name)的参数group指定所要添加的线程组,name指定新创建的线程的名称。
一个线程所允许的最大的优先级与该线程所在的线程组的所允许的是最大的优先级一样。
public final void setMaxPriority(int pri)用来给线程组设置最大的优先级,不能低于1,不能高于10(优先级的极限)。
同步语句块
类对象和实例化对象不是一个对象,进程同步时,实例化对象的锁不会影响到类对象的锁。
同步语句块的定义格式:synchronized(引用类型的表达式):(这里可以理解使用this和下面语句1的区别)
其中关键字synchronized是同步语句块的引导词;位于()内的表达式必须是引用类型的表达式,指向类对象或者实例化对象;语句块则由一对{}及这对大括号所括起来的一系列语句组成。在小括号内调用的对象,若没有被锁住,则Java虚拟机会让线程进入并运行同步语句块,同时引用类型的表达式所指向的对象锁就会锁住,当其退出同步语句块时,锁就会自动打开。
在同步语句块中,要让引用类型的表达式所指向的的对象为类对象可以通过java.lang.Class的静态方法:
public static Class forName(String className) throws ClassNotFoundException;className指定类或接口的名称,返回值即为指定的类或接口所对应的类对象的引用值。例如:Class t = Class.forName("java.lang.Thread")使得变量t的值为java.lang.Thread类对象的引用值。synchronized(Class.forName("类名"));.······1