Debug:
F6:下一步
F5:进入到方法中
F7:跳出方法
Junit:
@Test:方法测试
@Before和@After分别实在@Test执行前和执行后执行。
@BeforeClass和@AfterClass需要用在静态方法上,分别是在类加载和程序结束各执行一次
多线程:
进程:正在运行中的程序
线程:属于进程,是进程中一个可以独立运行的代码片段
进程需要依赖cpu执行,cpu某一时刻只能执行一个进程,我们看到的多个进行并发运行的现象
,是因为cpu做着告诉的切换动作。
实质一个进程可由多个线程组成,cpu实质切换的每个进程中的线程。
进程中只是有一个线程-----单线程程序
进程中有多个线程----多线程程序
创建线程的方式:
1.继承Thread
1.定义类继承Thread
2.在类中重写run方法
3.在main方法中,创建Thread的子类对象,并调用start方法启动线程
2.实现接口Runnable
1.定义类实现Runnable接口
2.实现run方法
3.创建Thread对象,并将实现给传递给Thread对象
4.调用start方法启动线程
建议使用实现接口方式,实现程序的多线程
继承弊端:
1.java是单继承,不能再去继承其他类
2.破坏了继承体系
多线程出现的数据安全问题:
同步代码块解决:
synchronized(对象锁){
共享数据代码
}
好处:解决了多线程的安全问题
弊端:效率降低了
前提:
1.两个或者是两个以上的线程
2.使用的是同一个锁对象
单例模式:
饿汉式:
class Test1{
private static final Test1 t = new Test1();
private Test1(){}
public static Test1 getInstance(){
return t;
}
}
弊端:如果想要使用类中的其他成员,而不需要对象时,造成空间浪费
懒汉式:
class Test2{
private static Test2 t = null;
private Test2(){}
public static Test2 getInstance(){
if(t == null)
t = new Test2();
return t;
}
}
死锁:
程序卡到某个地方,不继续向下执行。
注意:开发中不能写出死锁。
锁的嵌套容器出现死锁。
synchronized:
修饰符,可以修饰方法,修饰的方法具备了同步的特性,也会有锁。
非静态同步方法的锁对象是:this
静态同步方法的锁对象是:类名.class
线程的生命周期:
新建状态:new Thread()
可运行状态:start(),有执行资格,等待cpu的调度
正在运行状态:执行run()
终止状态:run()结束,stop()
阻塞状态:主动放弃执行资格,cpu不再调度
sleep,wait,join
package day20;
//共享代码块
class MyTicket implements Runnable{
private int ticket = 100;
// Object obj = new Object();
@Override
public void run() {
while(true){
// synchronized (obj) { //t1 t2
// if(ticket > 0) {
// System.out.println(Thread.currentThread().getName()+"...."+ticket);
// ticket--;
// }
// }
show();
}
}
public synchronized void show(){ //this
if(ticket > 0) {
System.out.println(Thread.currentThread().getName()+"...."+ticket);
ticket--;
}
}
}
public class Demo06 {
public static void main(String[] args) {
MyTicket my = new MyTicket();
Thread t1 = new Thread(my);
Thread t2 = new Thread(my);
t1.start();
t2.start();
}
}