多线程:
进程:是一个正在执行的程序。
每一个进程执行都有一个执行顺序。该顺序是一个执行路径。
线程:进程的的一个独立控制单元
线程名称:this.getName()
状态: 运行状态 、 临时状态 、 冻结状态 、 消亡状态
为什么要覆盖run方法?
Thread类用于描述线程。
该类就定义了一个功能,用于存储线程要运行的代码。该存储功能就是run方法
步骤:
1、定义类继承Thread
2、覆写Thread类中run方法
3、调用线程start方法 (作用: 启动线程,调用run方法)
方式1 (通过继承Thread):
Demo.java
public class Demo {
public static void main(String[] args) {
Test t = new Test();
t.start();
for(int i=0;i<60;i++){
System.out.println("--跑起来了" + i);
}
}
}
Test.java
public class Test extends Thread{
//覆写run方法
public void run(){
for(int i=0;i<60;i++){
System.out.println("++跑起来了" + i);
}
}
}
Test.java
public class Test {
public static void main(String[] args) {
Demo d = new Demo();
Thread d1 = new Thread(d);
Thread d2 = new Thread(d);
Thread d3 = new Thread(d);
Thread d4 = new Thread(d);
d1.start();
d2.start();
d3.start();
d4.start();
}
}
Demo.java
public class Demo implements Runnable{
private static int tick = 100;
public void run(){
while(true){
if(tick>0){
tick--;
System.out.println(Thread.currentThread().getName()+"卖票喽,还剩"+tick+"张");
}
}
}
}
区别:继承了Thread之后就不能继承其他类 但接口可以多实现
通过构造函数修改线程名称:
public class Test extends Thread{
//通过构造函数修改线程名称
public Test(String name) {
super(name);
}
//覆写run方法
public void run(){
for(int i=0;i<60;i++){
System.out.println(this.getName()+"***跑起来了" + i);
}
}
}
线程锁
当多条操作执行同一个共享数据时,为了安全问题,使用线程锁 (
同步代码块)。
synchronized (随意对象) {
需要被同步的代码
}
public class Demo implements Runnable{
Object obj = new Object();
private static int tick = 1000;
public void run(){
while(true){
synchronized (obj) {//线程锁
if(tick>0){
System.out.println(Thread.currentThread().getName()+"卖票喽,还剩"+--tick+"张");
}
}
}
}
}
方法2: 直接在函数前假关键字:synchronized (慎用)
缺点:容易吧不需要同步的代码一起包含,造成单线程。
同步函数的锁时this
静态同步方法的锁是:类名.class