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.线程分为用户线程和守护线程,其中守护线程起到陪伴的作用,只要有用户线程就会有守护线程存在,如果用户线程结束则守护线程也结束。典型的守护线程为垃圾回收器。
- Java多线程编程核心技术学习(一)
- Java多线程编程核心技术学习(二)
- 《Java多线程编程核心技术》学习笔记(一)——Java的多线程
- 《Java多线程编程核心技术》(一)多线程技能
- 多线程编程核心技术读书笔记(一):Java多线程技能
- Java核心技术(多线程)一
- Java多线程编程核心技术---线程间通信(一)
- Java多线程编程核心技术--Lock的使用(一)
- 《java多线程编程核心技术》核心笔记(一)
- 《java 多线程编程核心技术》读书笔记一
- 学习笔记:Java 多线程编程核心技术(第一章)
- Java多线程编程核心技术---学习分享
- 《Java多线程编程核心技术》学习笔记-第一章
- java多线程编程核心技术
- 《Java多线程编程核心技术》
- Java 多线程编程核心技术
- [Java多线程编程核心技术]
- 《java多线程编程核心技术》
- 两日小记
- 9月12日是个啥日子?在北京最少有5场安全领域重要的的会议!
- Git之删除本地仓库
- 禁用账户中文超字节bug修复——得出字符位数
- STL迭代器失效情况
- Java多线程编程核心技术学习(一)
- 禁用账户无法判断空格bug修复——强制输出
- 线程池浅析
- ActiceMQ原理及安装
- Windows下Ableton Live 9 下载&安装
- falcon模式
- getch() 函数
- 禁用账户无法判断空格bug修复(2)——倒取尾部空格
- Tset.1 温度