Java多线程与同步机制

本文详细介绍了Java多线程的相关概念,包括线程的创建、使用、生命周期、线程安全与同步机制,以及线程通信。讨论了同步机制的synchronized和Lock的区别,举例说明了单例模式下的线程安全问题,并提到了死锁的概念。此外,还探讨了线程通信的常用方法,如sleep()和wait()的异同。
摘要由CSDN通过智能技术生成

Java多线程

基本概念

  • 程序:为完成特定任务用某种语言编写的指令的集合,属于一段静态代码。
  • 进程:是程序的依次执行过程,正在运行的程序,存在生命周期。进程为资源分配的单位。每个进程在内存中有独占一个方法区和堆空间,被多个线程共享。
  • 线程:进程可以进一步细化为线程,是程序内部的一条执行路径。线程作为调度和执行的单位。每个线程拥有独立的虚拟栈空间和程序计数器。
  • 一个java应用程序实际上至少有三个线程,main主线程gc()垃圾回收机制的运行线程异常处理线程
  • 线程分为两类:用户线程守护线程。守护线程适用于服务用户线程的。用户线程结束,守护线程也就结束,所以守护线程是依赖于用户线程的。举个例子:java程序中,main是用户线程,垃圾回收就是守护线程。可以利用thread.setDaemon(true)将用户线程变成守护线程。

线程的创建和使用

线程的创建
  • 方式一:创建继承Thread类的子类,需要重写父类的run()方法,然后创建子类的对象,通过子类对象调用start()方法(包括采用匿名子类)。
public class MultiThreadingTest1 {
	public static void main(String[] args) {
		MyThread1 myThread = new MyThread1();
		myThread.start();
		//如果直接调用run方法不属于多线程,因为没有开启新线程
		//myThread.run();
		//同一个新线程的对象不能重复start启动,如想重新启动新线程,需要创建一个新的对象
		//myThread.start();//运行报错:java.lang.IllegalThreadStateException
		System.out.println("我是主线程");
		
		//匿名子类写法创建多线程
		new Thread() {
			@Override
			public void run() {
				// 此线程执行需要执行的操作声明在run中
				int sum = 0;
				for (int i = 0; i <= 100; i++) {
					sum += i;
				}
				System.out.println("我是匿名子类新线程");
			}
		}.start();
    }
}
class MyThread1 extends Thread {
	@Override
	public void run() {
		// 此线程执行需要执行的操作声明在run中
		int sum = 0;
		for (int i = 0; i <= 100; i++) {
			sum += i;
		}
		System.out.println("我是新线程");
	}
}
  • 方式二:创建实现Runnable的类,实现Runnable中的抽象方法run(),创建类的对象,将此对象传入Thread类的构造器中创建Thread类的对象,调用Thread类的对象的start()方法(包括匿名写法)。
 public class MultiTheadingTest2 {
	public static void main(String[] args) {
		MyThread2 myThread2 = new MyThread2();
		Thread thread = new Thread(myThread2);
		thread.start();
		System.out.println("我是主线程");
		//匿名写法
		new Thread(
				new Runnable() {
					@Override
					public void run() {
						// 此线程执行需要执行的操作声明在run中
						int sum = 0;
						for (int i = 0; i <= 100; i++) {
							sum += i;
						}
						System.out.println("我是匿名新线程");
					}
			}).start();
}
}
class MyThread2 implements Runnable{
	@Override
	public void run() {
		// 此线程执行需要执行的操作声明在run中
				int sum = 0;
				for (int i = 0; i <= 100; i++) {
					sum += i;
				}
				System.out.println("我是新线程");
	}	
}
  • 方式三:JDK5.0新特性。实现Callable接口。需要借助Future接口的唯一实现类FutureTask辅助线程的对象创建和返回值获取(FutureTask还实现了Runnable接口),再创建Thread对象,将FutureTask类的对象作为构造器参数传入,完成线程的创建,最后调用start()方法完成线程启动。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class MultiThreadTest3 {
	public static void main(String[] args) {
		MyThread3 myThread3 = new MyThread3();
		FutureTask futureTask = new FutureTask(myThread3);
		Thread thread = new Thread(futureTask);
		thread.start();
		
		try
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值