1.Java中Runnable和Thread的区别
Thread一个类只能继承一个父类,这是此方法的局限。
2.为啥非要使用start();方法启动多线程呢?
可以实现交互式运行,可以调用操作系统的底层函数!
(底层函数:比你编程的层次更靠近硬件的函数都算“底层”函数)
(层次是什么:
(1)加载父类(以下序号相同,表明初始化是按代码从上到下的顺序来的)
1.为父类的静态属性分配空间并赋于初值
1.执行父类静态初始化块;
(2)加载子类
2.为子类的静态属性分配空间并赋于初值
2.执行子类的静态的内容;
(3)加载父类构造器
3.初始化父类的非静态属性并赋于初值
3.执行父类的非静态代码块;
4.执行父类的构造方法;
(4)加载子类构造器
5.初始化子类的非静态属性并赋于初值
5.执行子类的非静态代码块;
6.执行子类的构造方法.
总之一句话,静态代码块内容先执行(父先后子),接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
)
3.为什么要用线程呢在什么时候用到!
想理解多线程你就得 搞清楚什么是并发 什么是并行 ,概念:在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主),但无论如何,要通过不断切换需要运行的线程让其运行的方式就叫并发(concurrent)。而在多CPU系统中,可以让两个以上的线程同时运行,这种可以同时让两个以上线程同时运行的方式叫做并行(parallel)。我也有段时间纠结于这里,无论如何我必须得给你明确一点:在某一个时间点,一个CPU(单)只会运行某一个进程里的单个线程,所以我们经常称之为并发,说道同步机制,其实多线程并未真正实现微观意义上的同步,进程是一个运行单元,线程则是更小的运行单元,简而言之,就是进程细分成多个线程,譬如:一个进程A运行需要1s,它就会切换到进程B,但是实现多线程机制后,进程A细化成10个线程,每个线程只需运行0.1s,当然B线程也一样,这就出现,线程之间的切换时间更短,从宏观上看就出现同步幻象了。所以学习多线程你得真正理解所谓的同步并发,并不是真正的“同步”。当你理解这些的时候,你就初略的感觉什么时候该使用多线程机制,其实你的电脑每个程序都至少有一个主线程,那个管理器中的每一个进程,其实内部包含若干线程,每个时间点都是某个程序进程中的某个线程在运行
4.线程的常用方法两个线程:
accountant和cashier,他俩共同拥有一个帐本。他俩都可以使用saveOrTake(int number)对帐本进
行访问,会计使用saveOrTake方法时,向帐本上写入存钱记录;出纳使用saveOrTake方法时,向帐本写入
取钱记录。因此,当会计正在使用saveOrTake方法时,出纳被禁止使用,反之也是这样。
1.线程的4种状态
在Java语言中,Thread类及其子类创建的对象称作线程,新建的线程在它的一个完
整的生命周期中通常要经历4种状态:新建,运行,中断,死亡
class MyThread extends Thread{
int number=0;
boolean stop=false;
booleangetStop(){
return stop;
}
public void run(){
while(true){
number++;
System.out.println(Thread.currentThread().getName()+"的number="+number);
if(number==3){
try{ System.out.println(Thread.currentThread().getName()+"被挂起");
stop=true;
hangUP();//挂起线程
System.out.println(Thread.currentThread().getName()+"恢复执行");
}
catch(Exception e){}
}
try{ Thread.sleep(1000);
}
catch(Exception e){ …}
}
}
public synchronized void hangUP() throwsInterruptedException{
wait();
}
public synchronized void restart(){
notifyAll();
}
}