线程初步

线程初步:
1、创建线程的两种方式:
通过Thread t = new Thread()创建,需要继承java.lang包中Thread类重写run()方法,然后让t.start()启动线程;
通过实现Runnable接口也重写了run()方法,接着把Runnable创建出来的对象当参数把它传进去
Runnable r = new XxxThread();
new Thread(r).start();
2、后台(daemon)线程 – 在后台提供一种通用服务的线程。当所有非后台线程结束之后,如main方法之类的线程,程序就终止了。
换句话说,即使daemon Thread还在运行,当其它非daemon线程都已经结束之后,程序就已结束!调用t.setDaemon(true);
3、获得当前线程及其名称:Thread.currentThread().getName()
4、给线程设置名称:
(1)对于实现了Runnable接口的线程则很简单,因为Java的API提供了这种实现:Thread(Runnable target, String name);
new Thread(t,"辅助线程1").start();
(2)对于继承自Thread类的线程类因为API没直接提供,但可以通过构造方法把名称作为参数传进去,然后客户端即可使用之。
public MyThread4(String name){
super(name);
}
Thread t = new MyThread4("某线程");
5、关于线程与垃圾回收的一个误解:
下面一共new出来5个线程,从JVM内存分析来看,当这个t它走出循环后应该说是要被垃圾回收的,但它没这么做
因为这是new出来的一个对象,存在堆中,跳出循环时,因为没有引用指向他所以垃圾回收会去把他回收走,但JVM
显然没有这么做,因为从另一个角度来看,这个线程对象t它还一直调用着run()方法,所以并不会被垃圾回收器给回收
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
Runnable t = new MyThread2();
new Thread(t).start();
}
for (int i = 0; i < 500; i++) {
System.out.println("Main ing ...."+i);
}
}
在main方法中,并不持有对线程对象的引用,对于普通对象,垃圾回收器将回收那些不再被引用的对象,
但线程对象比较特殊,只有在它的run方法结束之后,垃圾回收器才会考虑回收它
线程的基本控制:
1、isAlive():判断当前执行的线程是否还活着,可用于确定顺序的执行,比如当某个线程执行时候,
直到等他完全执行完了,下面的线程才有机会执行,如:下面的mt线程
MyThread mt = new MyThread();
mt.start();

while(mt.isAlive()){}

for (int i = 0; i < 500; i++) {
2、线程让步:yield():这是从概率上来讲的,一般会是当前线程让步给其他线程先执行自己最后执行,但并不好说
因此下面代码中mt线程先执行完,最后执行完的肯定是main中线程,即调用了yield方法的线程
mt.start();

for (int i = 0; i < 500; i++) {
System.out.println(Thread.currentThread().getName()+": "+i);
Thread.yield();
}
3、线程睡眠:sleep(millons)这个参数指的是毫秒数,即要睡多长的时间然后继续工作,但他也不是绝对的时间大概睡多久而已
4、线程的优先级:Thread的静态属性(MIN_PRIORITY、NORM_PRIORITY【5】、MAX_PRIORITY)一般在1-10之间
5、线程的吊起:a.join()

你可能感兴趣的:(jvm,thread,工作)