Java中的多线程

1、多线程的概念

允许程序中并发执行多个指令流,每个指令流即为一个线程

2、创建多线程的四种方式

(1)继承Thread类,重写run方法
(2)实现Runable接口,实现run方法
(3)实现Callable接口,实现call方法。把callable实例作为FutureTask的属性创建task任务,然后创建线程
(4)通过线程池创建线程

3、线程的生命周期及状态转换

线程的五种状态:新建状态、就绪状态、运行状态、阻塞状态(不可运行状态)、死亡状态

(1)新建状态:当创建一个线程对象后,该对象处于新建状态,此时线程未开始运行。
(2)就绪状态:当线程对象调用start()方法后,线程进入就绪队列排队,等待被调度获得CPU资源
(3)运行状态:一但线程对象获得CPU资源,线程就调用自己的run()方法,进入运行状态。
完成任务 —进入–> 死亡状态
其他原因阻塞 —进入–> 阻塞状态
(4)阻塞状态:又称不可运行状态。引起线程进入阻塞状态的原因
(i)通过sleep(milliseconds)使线程进入休眠状态(可以通过已休眠的线程调用interrupt()方法退出休眠状态),在指定时间内线程不会运行
(ii)通过wait()方法使线程挂起。直到线程得到了notify()或notifyAll()消息,才会进入就绪状态
(iii)线程等待某个输入、输出的完成
(iiii)线程试图在某个对象上调用同步控制方法,但是对象锁不可用。因为另一个对象已经获得了这个锁
(5)死亡状态
(i)线程完成任务自然死亡
(ii)强制终止:如调用Thread的destroy()方法或stop()方法

4、线程的让步(yield)

当前运行的线程调用yield()方法,暂时放弃CPU,给其他线程一个执行的机会。yield()方法只会给相同或更高优先级的线程以执行的机会,所以调用yield()方法的线程不一定保证会放弃CPU。当所有线程中只有它优先级最高时,即使它调用了yield()方法也不会放弃CPU。

5、线程的联合(join)

一个线程A在占有CPU资源期间,可以让其他线程调用join()方法和本线程联合。如B.join(),称为A线程在运行期间联合了B线程。如果A线程在占有CPU资源期间一但联合B线程,那么A线程将立刻中断执行,一直等到它联合的线程B执行完毕,A线程再重新排队等待CPU资源。

6、线程的互斥

当多个线程竞争使用一个共享资源时如内存中的变量时,需要保证在一个时刻内只有一个线程操作该变量即互斥的访问和操作该变量。
临界区:即被竞争调用的一段程序段。也属于共享资源
synchronized:同步关键字。该关键字实现了线程互斥访问共享资源,确保任何时刻只能有一个线程对共享资源进行访问和操作。可以修饰一段程序段或一个方法,相当于给临界区加锁。

对象的wait()方法:当线程拥有该对象的锁,在同步代码块中调用该对象的wait()方法,当前线程释放该“对象锁”,进入阻塞状态,Java系统将当前线程放入该对象的等待队列。
对象的notify()方法:当另外一个线程调用该对象的notify()或者notifyAll(),释放该对象的锁。notify唤醒任意一个线程,从中断处继续执行。notifyAll()唤醒所有在该对象上等待的线程,按照“先中断先执行”原则选择最先中断的线程继续在该对象中断处执行。

7 、守护线程

一个线程通过调用他的setDaemon(boolean on)为true时,设置自己为一个守护线程。
当所有非守护线程运行结束,即使守护线程的run方法中还有未执行的语句,也会理科结束运行。

8、线程间的通信

Java线程间的通信是通过管道流来实现的。一个线程发送数据到输入管道,另一个线程从输出管道中读数据。管道用来把一个线程或代码块的输出连接到拎一个线程或代码块中

Java线程间的通信是通过管道流PipeOutputstream和PipeInputStream来实现的,代码如下:
//发送方
public class Sender implements Runnable {
	
	private PipedOutputStream out = new PipedOutputStream();
	public PipedOutputStream getPipeOutputStream(){
		
		return this.out;
	}

	@Override
	public void run() {
		String s = "这是管道输出流发送过来的数据";
		try {
			out.write(s.getBytes());
			out.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

//接收方
public class Receiver implements Runnable{
	
	private PipedInputStream in;
	public Receiver(Sender sender){
		try {
			in = new PipedInputStream(sender.getPipeOutputStream());
			//创建管道输入流类对象,实现管道流的连接
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}


	@Override
	public void run() {
		byte[] b = new byte[1024];
		try {
			int count = 0;
			while((count=in.read(b))!=-1){
				String s = new String(b, 0, count);
				System.out.println(s);
			}
			in.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}


//测试类
public class Test {
	
	public static void main(String[] args) {
		Sender sender = new Sender();
		Receiver receiver = new Receiver(sender);
		
		Thread senderThreader = new Thread(sender);
		Thread receiverThreader = new Thread(receiver);
		
		senderThreader.run();
		receiverThreader.run();
	}

}

运行结果

在这里插入图片描述

### 回答1: Java 多线程可以通过创建 Thread 类的实例来实现。具体步骤如下: 1. 创建一个实现 Runnable 接口的类,该类实现 run() 方法。 ```java public class MyRunnable implements Runnable { public void run() { // 执行线程的操作 } } ``` 2. 创建一个 Thread 实例,并将实现了 Runnable 接口的类作为构造函数的参数。 ```java MyRunnable myRunnable = new MyRunnable(); Thread thread = new Thread(myRunnable); ``` 3. 启动线程。 ```java thread.start(); ``` 此外,还可以通过继承 Thread 类来实现多线程。具体步骤如下: 1. 创建一个继承自 Thread 类的类,重写 run() 方法。 ```java public class MyThread extends Thread { public void run() { // 执行线程的操作 } } ``` 2. 创建 MyThread 的实例。 ```java MyThread myThread = new MyThread(); ``` 3. 启动线程。 ```java myThread.start(); ``` 在多线程的使用,需要注意线程安全的问题,比如共享变量的访问、同步操作等。可以使用 synchronized 关键字或者 Lock 接口来保证线程安全。 ### 回答2: 在Java多线程的使用是指程序同时运行多个线程,每个线程执行自己的任务。Java多线程的使用可以带来以下几点好处: 1. 提高程序的效率:多线程可以对多个任务进行并发处理,提高程序的运行效率。例如,可以将网络请求和UI界面分别放在两个不同的线程,这样即使网络请求比较耗时,UI界面也能进行响应,不会出现界面假死的情况。 2. 充分利用系统资源:多线程可以充分利用系统的处理器资源,提高系统的利用率。在多核处理器上运行多个线程,可以让每个核心都得到充分利用,提高系统的整体性能。 3. 实现异步编程:多线程可以实现异步编程,即一个线程执行后续操作,不需要等待另一个线程的完成。这样可以提高程序的响应速度。例如,可以使用多线程来进行文件下载,下载过程可以同时进行其他操作。 4. 处理复杂的并发情况:在一些需要处理多个并发操作的场景多线程可以提供更好的解决方案。例如,在并发访问共享资源的情况下,使用线程锁可以保证对共享资源的安全访问,避免数据冲突和一致性问题。 Java使用多线程可以通过创建Thread类的实例或者实现Runnable接口来实现。通过继承Thread类来创建线程,需要重写run方法,在run方法定义线程要执行的任务。通过实现Runnable接口来创建线程,需要实现run方法,并将实现了Runnable接口的对象作为参数传递给Thread类的构造方法。 总之,Java多线程的使用使得程序可以同时执行多个任务,提高了程序的效率和用户体验,并且能够处理复杂的并发情况。但需要注意多线程的安全性和线程之间的协作,避免出现数据冲突和一致性问题。 ### 回答3: Java多线程的使用是指在一个程序同时执行多个任务或者同时处理多个请求。多线程可以提高程序的并发性和响应性,可以将耗时的操作和任务分配给不同的线程来执行,从而提高程序的运行效率。 在Java多线程的使用主要依靠Thread类或者实现Runnable接口来创建线程。可以通过继承Thread类创建一个线程类,并重写run方法,在run方法定义需要执行的任务;也可以实现Runnable接口,创建一个Runnable对象,然后将该对象作为参数传递给Thread类的构造方法,创建一个线程对象。 使用多线程的好处是可以充分利用处理器的多核特性,同时进行多个任务,提高程序的运行效率。多线程还可以提高程序的响应性,当程序有耗时的操作时,可以将其放在一个独立的线程执行,防止主线程被阻塞,提高用户体验。 然而,多线程的使用也存在一些问题。首先是线程安全问题,多个线程同时访问共享资源可能导致数据不一致或者数据损坏。为解决这个问题,可以使用同步机制,如synchronized关键字或Lock接口,保证在同一时间只有一个线程能够访问共享资源。其次,多线程的创建和销毁会消耗系统资源,如果线程数量过多,可能会影响系统性能。因此,在使用多线程时应该合理控制线程的数量。另外,线程之间的协调和通信也是一个值得关注的问题,可以使用wait、notify、join等方法来实现线程间的协作。 总之,Java多线程的使用可以提高程序的并发性和响应性,但需要注意线程安全、资源消耗以及线程协调和通信等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值