线程:线程是一个动态执行的过程,它也有一个从产生到死亡的过程。
并发:指两个和多个事件在同-一个时间段内发生,CPU高速切换交替去执行任务。
并行:指两个和多个事件在同-一个时间发生,执行任务。
java主线程
线程的创建
方式一:通过继承Thraed创建
步骤:(1)创建Thread的子类
(2)重写父类中的run,并且编写新线程要执行的内容
(3)创建Thread对象,调用strat()方法,开启一个线程,会自动执行run方法
设置线程的名字:
(1)调用Thread类中的setName(“名字”)设置
(2)在run方法调用getName();获取线程名称
补充:通过匿名内部类创建线程
public class MyThread extends Thread {
//新的线程开启后,会执行run方法中的内容
@Override
public void run() {
try{
for (int i = 0; i <10 ; i++) {
//getName()获取线程名称
System.out.println(getName()+"打游戏");
Thread.sleep(1000);
}}catch(Exception e){
e.printStackTrace();
}
}
}
public class Test {
public static void main(String[] args) throws Exception{
//创建Thread对象
MyThread t = new MyThread();
//设置线程名字
t.setName("我的线程");
//开启线程,会自动执行run方法
t.start();
}
}
//通过匿名内部类创建线程
Thread t2= new Thread() {
//
@Override
public void run() {
try{
for (int i = 0; i < 10; i++) {
System.out.println(getName()+"跳舞");
Thread.sleep(1000);
}
}catch (Exception e){
e.printStackTrace();
}
}
};
方式二:通过实现Runable创建接口
步骤:(1)创建Runable接口实现类
(2)重写run方法,编写线程执行的内容
(3)创建Runnable实现类对象
(4)创建Thread对象,通过构造函数传递实现类对象,调用start()开启线程,执行run方法
线程名字的设置:通过Thread构造函数设置名称,在run方法中通Thread.currentThread().getName()获取。
补充:通过匿名内部类创建线程
public class YourThread implements Runnable{
@Override
public void run() {
try{
for (int i = 0; i <10 ; i++) {
//获取线程名称:通过获取到当前正在执行的线程来获取名称
System.out.println(Thread.currentThread().getName()+"打游戏");
Thread.sleep(1000);
}}catch(Exception e){
e.printStackTrace();
}
}
}
public class Test {
public static void main(String[] args) {
//开启线程
//创建实现类对象
YourThread t = new YourThread();
//创建Thread对象,通过构造函数传递实现类对象
Thread thread = new Thread(t,"你的线程");
//调用start方法开启线程
thread.start();
//创建匿名内部类创建线程
Runnable r=new Runnable(){
@Override
public void run() {
try{
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"跳舞");
Thread.sleep(1000);
}
}catch (Exception e){
e.printStackTrace();
}
}
};
new Thread(r,"名字").start();
}
}
6. 线程安全问题:当多个线程操作同一资源时,线程之间没有协调执行,没有达到预期的效果。
线程同步:使用线程同步解决线程安全问题
原理:将会出现线程安全问题的代码,加上一个同步锁, 当多个线程操作同一个资源的时候,必须获取到锁后才能操作资源 保证每次次有一个线程在操作资源。
2、同步的方式:
(1)使用同步代码块
格式:
synchronized(锁对象){//可以使用任意一个对象来充当锁,但是要保证锁对象只能由一个
//可能会出现线程安全的代码
}
(2)(2)使用同步方法(静态,非静态):将可能会出现线程安全的代码放在一个同步方法中去
同步方法:使用synchronized修饰的方法
静态:锁是当前类Class字节码对象
非静态:锁是当前对象this