Java多线程编程核心技术学习(一)

来源:互联网 发布:指纹软件锁 编辑:程序博客网 时间:2024/05/16 02:59

参考自:Java多线程编程核心技术_高洪岩

1.Thread可extends,子类只能继承一个父类,并且为Runnable的实现类;Runnable可implements,可实现多个。

public void ThreadTest extends Thread{

    @Override

    public void run(){

        //TODO

    }

}

public class Thread9 implements Runnable, Serializable{
    private static final long serialVersionUID = 1L;
    @Override
    public void run() {
        // TODO
    }
}

2.run()方法和start()方法区别

run()方法是普通的方法调用,按顺序执行,调用的run方法执行完后,才会继续执行其后的方法;

start()真正实现了多线程

参考自:http://blog.csdn.net/xuxurui007/article/details/7685076 的解释如下

start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。
run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。

3.System.out.println,println()方法内部是同步的

public void println(String x){

    print(x);

    newLine();

}

4.currentThread可获取正在被调用的线程的情况。其中this.getName()和Thread.currentThread().getName()区别如下:

1)this.getName()只能在Thread子类中执行,代表的是Thread对象,Thread.currentThread().getName()可在任何情况下执行;

2)如下方法执行情况如下。Thread.currentThread().getName()为执行此行代码的线程的name,this.getName()执行的为调用该方法的对象。

public class Thread1 extends Thread{
    public Thread1(){
        System.out.println("构造方法打印结果:"+Thread.currentThread().getName());
        System.out.println("构造方法this.getName:"+this.getName());
    }
    @Override
    public void run(){
        System.out.println("run方法的打印结果:"+Thread.currentThread().getName());
        System.out.println("run方法this.getName:"+this.getName());
    }
}

public class Test1 {
    public static void main(String[] args) {
        Thread1 t1 = new Thread1();
        t1.setName("a");
        t1.start();
    }
}

public class Test2 {http://write.blog.csdn.net/postedit
    public static void main(String[] args) {
        Thread1 t1 = new Thread1();
        Thread t = new Thread(t1);
        t.setName("a");
        t.start();
    }
}

Test1执行结果:

构造方法打印结果:main
构造方法this.getName:Thread-0
run方法的打印结果:a
run方法this.getName:a

Test2执行结果:

构造方法打印结果:main
构造方法this.getName:Thread-0
run方法的打印结果:a
run方法this.getName:Thread-0

5.停止线程的方法

1)stop()方法停止,虽然能停止但是已废弃,因为一方面使一些清理工作得不到完成,另外一方面可能会对一些锁定对象进行解锁,使得数据不能同步,造成数据不一致的问题。

2)isInterrupted()和return结合使用,先判断是否停止,如果停止,直接返回。但是推荐使用抛异常的方式,因为在catch块还可以将异常向上抛,使得异常得以传播。

6.isInterrupted()和interrupted()的区别

isInterrupted()方法判断是否停止后,不清除暂停标识;

interrupted()方法判断是否停止后,清除暂停标识。

7.暂停线程的方法

suspend()暂停线程,resume()恢复线程,但是二者有个缺点就是会造成对公用的同步对象的独占,使得其他的线程无法访问该对象;还容易出现因为线程的暂停不同步的现象。suspend被废弃。

8.yield()放弃当前的cpu资源给其他线程,放弃资源的时间不确定。

9.线程优先级从1-10,最高为10,最低为1,优先级越高,越能获得较多的cpu资源,当低于1或者高于10时会报出java.lang.IllegalArgumentException的异常

线程中预定义的几个常量Thread.MAX_PRIORITY=10,Thread.MIN_PRIORITY=5,Thread.NORM_PRIORITY=1。

线程的优先级具有继承性,如果A线程调用了B线程,则B具有与A线程相同的优先级。

10.线程分为用户线程和守护线程,其中守护线程起到陪伴的作用,只要有用户线程就会有守护线程存在,如果用户线程结束则守护线程也结束。典型的守护线程为垃圾回收器。








原创粉丝点击