java实际项目中,一个主方法中增加两个线程同时调用怎么写
时间: 2024-02-09 13:07:54 浏览: 28
在Java中创建线程有两种方式:继承Thread类和实现Runnable接口。这里我以实现Runnable接口为例,创建两个线程同时调用:
1. 创建两个实现了Runnable接口的类,例如ThreadA和ThreadB。
```java
public class ThreadA implements Runnable {
public void run() {
// 线程A要执行的代码
}
}
public class ThreadB implements Runnable {
public void run() {
// 线程B要执行的代码
}
}
```
2. 在主方法中创建两个线程,并把实现了Runnable接口的类作为参数传入。
```java
public static void main(String[] args) {
Thread t1 = new Thread(new ThreadA());
Thread t2 = new Thread(new ThreadB());
t1.start();
t2.start();
// 主线程要执行的代码
}
```
这样就创建了两个线程t1和t2,同时调用了它们的run()方法。注意,在启动线程之后,主线程还会继续执行自己的代码,直到所有线程执行完毕。
相关问题
用Java如何让两个线程调用同一个方法,遍历出字符串中不同的字符
在Java中,可以通过使用两个线程来同时调用同一个方法,并遍历出字符串中的不同字符。下面是一个示例代码,演示了如何实现这个功能:
```java
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
String str = "Hello, World!";
Set<Character> uniqueChars = new HashSet<>();
Thread t1 = new Thread(() -> {
for (char c : str.toCharArray()) {
synchronized (uniqueChars) {
if (!uniqueChars.contains(c)) {
uniqueChars.add(c);
System.out.println("Thread 1: Found unique character: " + c);
}
}
}
});
Thread t2 = new Thread(() -> {
for (char c : str.toCharArray()) {
synchronized (uniqueChars) {
if (!uniqueChars.contains(c)) {
uniqueChars.add(c);
System.out.println("Thread 2: Found unique character: " + c);
}
}
}
});
t1.start();
t2.start();
}
}
```
在这个例子中,我们创建了两个线程(t1和t2),它们同时遍历给定的字符串(str)。每个线程都使用一个`Set`(uniqueChars)来存储已经遇到的字符。
在遍历过程中,我们使用`synchronized`关键字来确保两个线程不会同时修改`uniqueChars`集合。这样可以防止竞态条件(race condition)和数据不一致的问题。
每当一个线程发现一个不同的字符时,它会将它添加到`uniqueChars`集合中,并打印出相应的消息。
请注意,由于线程的执行顺序是不确定的,因此输出的顺序可能会有所不同。但是,最终的结果应该是包含了字符串中所有不同字符的集合。
用java如何实现两个线程一个写数据另一个读数据
可以使用Java中的Lock和Condition来实现两个线程一个写数据另一个读数据的功能。具体实现步骤如下:
1. 创建一个共享数据的类,其中包含一个数据变量和两个方法,一个用于写入数据,一个用于读取数据。
2. 创建一个写线程类,该类实现Runnable接口并重写run方法,在run方法中调用共享数据类的写入方法。
3. 创建一个读线程类,该类实现Runnable接口并重写run方法,在run方法中调用共享数据类的读取方法。
4. 在主方法中创建共享数据对象和两个线程对象,然后启动这两个线程。
下面是具体的代码实现:
```java
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class SharedData {
private int data;
private boolean available = false;
private final Lock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
public void write(int data) {
lock.lock();
try {
while (available) {
condition.await();
}
this.data = data;
available = true;
condition.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public int read() {
lock.lock();
try {
while (!available) {
condition.await();
}
available = false;
condition.signalAll();
return data;
} catch (InterruptedException e) {
e.printStackTrace();
return -1;
} finally {
lock.unlock();
}
}
}
class Writer implements Runnable {
private SharedData sharedData;
public Writer(SharedData sharedData) {
this.sharedData = sharedData;
}
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
sharedData.write(i);
System.out.println("写入了数据:" + i);
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Reader implements Runnable {
private SharedData sharedData;
public Reader(SharedData sharedData) {
this.sharedData = sharedData;
}
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
int data = sharedData.read();
System.out.println("读取了数据:" + data);
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test {
public static void main(String[] args) {
SharedData sharedData = new SharedData();
Thread writerThread = new Thread(new Writer(sharedData));
Thread readerThread = new Thread(new Reader(sharedData));
writerThread.start();
readerThread.start();
}
}
```
在上面的代码中,使用Lock和Condition来实现了一个共享数据类,该类包含一个数据变量和两个方法,一个用于写入数据,一个用于读取数据。在写入方法中,如果数据已经被写入,则等待读取方法读取数据,否则将数据写入并通知读取方法可以读取数据了;在读取方法中,如果没有数据可读,则等待写入方法写入数据,否则读取数据并通知写入方法可以写入数据了。在主方法中创建共享数据对象和两个线程对象,然后启动这两个线程,写线程将数据写入共享数据对象,读线程从共享数据对象中读取数据。