对于java程序来说,在dos窗口中输入:
java helloworld 回车之后
会先启动JVM,而JVM就是一个进程,JVM再启动一个主线程调用一个main方法
同时再启动一个垃圾回收线程负责看护,回收垃圾,现在的java程序中至少有两个线程并发
举个例子
注意:进程A和进程B的内存不共享。在java语言中:线程A和线程B,堆内存和方法区内存共享。但是栈内存独立,一个线程一个栈。
假设启动十个线程,会有十个栈空间,每个栈和每个栈之间,互不干扰。各自执行各的,这就是多线程并发。
火车站中的每一个售票窗口可以看作一个个线程,我在窗口一买票,你可以在窗口二买票,你不需要等我,我也不需要等你,所以多线程并发可以提高效率。
使用了多线程机制后,main方法结束,是不是有可能程序也不会结束
main方法结束之后只是主线程结束了,主栈空了,其他栈(线程)可能还在弹栈压栈。

什么是真正的多线程并发
t1线程执行t1的,t2线程执行t2的,互不影响,这叫做真正的多线程并发,
单核的CPU只有一个大脑,所以不能够做到真正的多线程并发,但是可以给到人一种“多线程并发”的感觉。
对于单核的CPU来说,在某一个时间点上实际上只能处理一件事情,但是由于CPU处理速度极快,多个线程之间频繁切换执行,给人的感觉是多个事情同时在做。
线程A和线程频繁切换执行,人会感觉音乐一直在播放,游戏一直在打,给我们的感觉是同时并发的。
MyThread myThread = new MyThread();
//启动线程
//start()方法的作用是:启动一个分支线程,在JVM中开辟一个新的栈空间,这段代码任务完成之后,瞬间就结束了
//这段代码的任务只是为了开辟一个新的栈空间,只要新的栈空间开出来,start()方法就结束了。线程就启动成功了。
//启动成功的线程会自动调用run方法,并且run方法在分支栈的底部(压栈)
//run方法在分支栈的地步,main方法在主栈的栈底部。run和main是平级的。
myThread.start();
//这里的代码还是运行在主线程中
for(int = i; i<1000;i++){
System.out.println("主线程---->"+i);
}
class MyThread extends Thread{
@override
public void run(){
//编写程序,这段程序运行在分支线程中(分支栈)
for(int i = 0;i<1000;i++){
System.out.println("分支线程---->"+i)
}
}
}

run和start的区别

第二种方式:编写一个类,实现java.lang.Runnable接口,实现run方法

总结

第二种方式实现接口比较常用,因为一个类实现了接口,它还可以去继承其他的类,更灵活
采用创建匿名内部类的方式可以吗?


static void sleep(long millis)




注意:这个不是中断线程的执行,是终止线程的睡眠。




实例方法:
void setPriority(int newPriority)//设置线程的优先级
int getPriority()//获取线程的优先级
最低优先级 1
默认优先级 5
最高优先级 10
优先级高的获取CPU时间片可能会多一些(但也不完全是,大概率是)
静态方法
static void yield()//让位方法
暂停当前正在执行的线程对象,并执行其他线程
yield()方法不是阻塞方法,让当前线程让位,让给其他线程使用
yield()方法的执行会让当前线程从“运行状态”回到“就绪状态”
注意:在回到就绪之后,有可能还会抢到
实例方法:void join()//合并线程
以后在开发中,我们的项目都是运行在服务器当中,而服务器已经将线程定义,线程对象的创建,线程的启动等都已经实现完了,这些代码我们都不需要编写
最重要的是:你要知道,你编写的程序要放到一个多线程下的环境下去运行,你更需要关注的是这些数据在多线程并发的环境写是否是安全的(重点!!!)
三个条件
当多线程并发的环境下,有共享数据,并且这个数据还会被修改,此时就存在线程安全问题,怎么解决这个问题?
线程排队执行(不能并发)
用排队执行解决线程安全问题
这种机制叫做:线程同步机制
专业术语叫做:==线程同步,==实际上就是线程不能并发了,线程必须排队执行。
线程同步就是线程排队了,线程排队会牺牲一部分效率,没办法,数据安全第一位。
