------<a target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一.实现线程的两种方式:
方式一:
1.继承自Thread;
2.重写run();
3.启动:
1).实例化自定义线程的对象;
2).调用start();
class MyThread extends Thread{
public void run(){
//代码
}
}
main(){
MyThread t = new MyThread();
t.start();
}
方法二:
1.实现Runnable接口
2.重写run()方法;
3.启动:
1).实例化自定义对象;
2).实例化Thread对象,传递我们的自定义对象;
3).调用Thread的start()方法;
class MyRunnable implements Runnable{
public void run(){
//代码
}
}
main(){
MyRunnable myRun = new MyRunnable();
Thread t = new Thread(myRun);
t.start();
//写成一句话
new Thread(new MyRunnable()).start();
}
二.线程的调度:
1.休眠:sleep(long millis):
2.加入:join():调用join()的线程会保证先执行完毕,后续start()的线程会等待当前线程完成再执行;
3.礼让:yield():使当前线程退回到"就绪"状态,同其它线程站在同一起跑线上等待操作系统分配资源。
很有可能会被再次的分配到执行时间;
4.守护线程:setDaemon(true):守护线程:当主进程结束,守护线程同时结束。(不会立即,会有个小缓冲)
非守护线程:当主进程结束,非守护线程会继续执行。应用程序不会立即结束,会等待线程执行完毕;
5.中断:stop():过时:
interrupt():当线程内,处于Object--wait()或者Thread--join()或者Thread--sleep()三种阻塞状态时,会促使这种阻塞
发生异常,我们在异常处理的代码中可以结束掉当前的线程执行;
6.线程的生命周期:
新建--(start())-->就绪--(由操作系统分配)-->运行--(stop()或者interrupt()或者run()方法执行完毕)-->死亡
面试题:
1.当调用线程的start()方法后,线程就会立即运行;这句话说得不对。
三.同步:
1.当多个线程访问同一资源时,会产生"并发访问"的问题:
2."并发性访问"的判断标准:
1).是否是多线程环境
2).是否有共享数据
3).是否有多条语句操作共享数据
3.解决方法:加锁:使用关键字:synchronized
4.语法格式:
1).同步代码块:
synchronized(被锁的对象){
}
2).同步方法:
public synchronized void set(int num){
}
3.静态方法内部也可以定义同步代码块;
public static void show(){
synchronized(class对象){
}
}
4).静态方法也可以被声明为synchronized:
public synchronized static void show(){
} |
|