* B:JVM的启动是多线程的吗
* JVM启动至少启动了垃圾回收线程和主线程,所以是多线程的
代码演示如下:
public class Demo1_Thread {
//证明jvm是多线程的
public static void main(String[] args) {
for(int i = 0; i < 100000; i++) {
new Demo();//产生很多垃圾,
}
for(int i = 0; i < 10000; i++) {
System.out.println("我是主线程的执行代码");//交替输出
}
}
}
class Demo {
@Override
public void finalize() {
System.out.println("垃圾被清扫了");//交替输出,说明JVM启动至少启动了垃圾回收线程和主线程
}
}
###24.04_多线程(多线程程序实现的方式1)(掌握)
* 1.继承Thread
* 定义类继承Thread
* 重写run方法
* 把新线程要做的事写在run方法中
* 创建线程对象
* 开启新线程,内部会自动执行run方法
代码演示如下:
public class Demo2_Thread {
public static void main(String[] args) {
MyThread mt = new MyThread();//4,创建自定义类的对象
mt.start();//5,开启线程
for(int i = 0; i < 3000; i++) {
System.out.println("主线程bbb");//开启子线程的时间CPU切换很快,所以主线程先输出内容,
}
}
}
class MyThread extends Thread {//1,定义类继承Thread
public void run() { //2,重写run方法
for(int i = 0; i < 3000; i++) {//3,将要执行的代码,写在run方法中
System.out.println("子线程aaa");//子线程要开启完毕后,才调用run方法执行输出内容
}
}
}
总结:在子线程开启还没有完成的一定时间里,主线程就把内容输出一部分,说明CPU切换很快,
然后子线程开启后,两个线程抢占资源分别交替输出
###24.05_多线程(多线程程序实现的方式2)(掌握)
* 2.实现Runnable
* 定义类实现Runnable接口
* 实现run方法
* 把新线程要做的事写在run方法中
* 创建自定义的Runnable的子类对象
* 创建Thread对象,传入Runnable
* 调用start()开启新线程,内部会自动调用Runnable的run()方法
代码演示如下:
public class Demo3_Runnable {
public static void main(String[] args) {
MyRunnable mr = new MyRunnable();//4,创建自定义类对象
Thread t = new Thread(mr);//5,将其当作参数传递给Thread的构造函数
t.start();//6,开启线程
for(int i = 0; i < 3000; i++) {
System.out.println("主线程bb");
}
}
}
class MyRunnable implements Runnable {//1,自定义类实现Runnable接口
@Override
public void run() {//2,重写run方法
for(int i = 0; i < 3000; i++) {//3,将要执行的代码,写在run方法中
System.out.println("子线程aa");
}
}
}
###24.17_多线程(同步方法)(掌握)
* 使用synchronized关键字修饰一个方法,该方法中所有的代码都是同步的
* 非静态的同步方法的锁对象是this,静态的同步方法的锁对象是该类的字节码对象
代码演示如下:
public class Demo2_Synchronized {
public static void main(String[] args) {
final Printer2 p = new Printer2();
new Thread() {
public void run() {
while(true) {
p.print();
// p.print1();
}
}
}.start();
new Thread() {
public void run() {
while(true) {
p.print0();
// p.print2();
}
}
}.start();
}
###24.18_多线程(线程安全问题)(掌握)
* 多线程并发操作同一数据时,就有可能出现线程安全问题,如出现票数为负数,为0的情况
* 使用同步技术可以解决这种问题,把操作数据的代码进行同步,不要多个线程一起操作
代码演示如下:
public class Demo2_Synchronized {
//需求:铁路售票,一共100张,通过四个窗口卖完
public static void main(String[] args) {
TicketsSeller t1 = new TicketsSeller();
TicketsSeller t2 = new TicketsSeller();
TicketsSeller t3 = new TicketsSeller();
TicketsSeller t4 = new TicketsSeller();
###24.19_多线程(火车站卖票的例子用实现Runnable接口)(掌握)
代码演示如下:
public class Demo4_Ticket {
//火车站卖100张票的例子用实现Runnable接口方式实现
public static void main(String[] args) {
MyTicket mt = new MyTicket();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();
new Thread(mt).start();