进程:一个正在运行的应用程序,负责内存空间的划分。
线程:一个进程中的代码是有线程来执行的,线程也是进程中的一个执行路径。
多线程:一个进程中有多个线程可以同时进行执行。
多线程的优点:
1、一个进程中多个线程可以同时执行。
2、提高了资源的利用率。
多线程的劣势:
1、降低了一个进程中多线程的执行概率。
2、增加了cpu负担。
3、出现线程安全问题。
4、出现死锁。
自定义线程的步骤:
1、自定义类,该类继承Thread类。
2、重写run方法。
3、创建Thread子类对象,调用start方法,来启动线程。
注意:千万不要直接调用run方法,调用start方法的时候线程会启动,线程一旦开启就会执行run方法中的代码,如果直接调用run方法,那么久相当于调用了一个普通方法而已。
线程安全问题的解决方案;
方式一:可以用手同步代码来解决
格式:synchronized(锁对象)
{
同步的代码块
}
同步代码块的注意事项:
1、锁对象是任意的一个对象。
2、一个线程在同步代码块中sleep了,其不会释放资源。
3、如果不存在线程安全问题时,不要使用同步代码块,因为会降低效率。
4、锁对象必须是多线程的共享对象,不然锁不住。
注意:资源设置为静态,多线程必须是同一个锁对象。
方式二:同步函数,同步函数就是使用synchronized修饰函数
格式如;public synchronized void run();
同步函数注意的事项:
1、如果是一个如果是一个非静态的同步函数的锁对象是this对象,如果是静态的同步函数的锁对象是当前函数所属的类的字节码文件(class对象)。
2、同步函数的锁对象是固定的,不是由我们自己定义的。
死锁现象出现的根本原因:
1、存在两个或者两个以上的线程。
2、存在两个或者两个以上的共享资源。
死锁现象的解决方案:没有方案,只能尽量避免。
class test extends Thread
{
static int tick= 40;
test(String name)
{
super(name);
}
@Override
public void run() {
if("张三".equals(Thread.currentThread().getName()))
{
synchronized("遥控器")
{
System.out.println("张三拿到遥控器,准备去拿电池");
synchronized("电池")
{
System.out.println("张三拿到了电池和遥控器,开了空调开心");
}
}
}
else if("李四".equals(Thread.currentThread().getName()))
{
synchronized("电池")
{
System.out.println("李四拿了电池,准备去拿遥控器");
synchronized("遥控器")
{
System.out.println("李四拿到了遥控器和电池,开了空调开心");
}
}
}
}
}
class wu
{
public static void main(String [] args)
{
test t1 = new test("张三");
test t2 = new test("李四");
t1.start();
t2.start();
}
}