线程有哪些类型,如何创建、中止线程?在多线程应用中,为使线程间的某些操作同步,一般使用哪些同步对象,并列举使用其中一种对象需要用到的API函数?
时间: 2024-05-03 21:22:08 浏览: 51
线程有用户线程和内核线程两种类型。用户线程是由用户程序创建和管理的,操作系统对其一无所知,而内核线程是由操作系统内核创建和管理的,可以被操作系统调度和管理。
在Java中,可以通过继承Thread类或实现Runnable接口来创建线程。线程可以通过调用它的stop()方法来中止线程,但这种方式已经过时且不安全,建议使用interrupt()方法或设置一个标志来控制线程的执行。
在多线程应用中,为使线程间的某些操作同步,一般使用锁、信号量、条件变量、原子变量等同步对象。其中,最常用的是锁(例如Java中的synchronized关键字和ReentrantLock类),使用锁需要通过lock()方法来获取锁、通过unlock()方法来释放锁。
例如,在Java中使用synchronized关键字实现线程同步,需要使用以下API函数:
1. synchronized关键字:用于保护共享资源,可以用于方法或代码块。
2. wait()方法:用于使线程等待,直到另一个线程调用notify()或notifyAll()方法来唤醒它。
3. notify()方法:用于唤醒一个等待的线程。
4. notifyAll()方法:用于唤醒所有等待的线程。
示例:
```java
public class SynchronizedTest {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
public static void main(String[] args) {
SynchronizedTest test = new SynchronizedTest();
Thread t1 = new Thread(() -> {
for (int i = 0; i < 100000; i++) {
test.increment();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 100000; i++) {
test.increment();
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(test.getCount());
}
}
```
在上面的例子中,使用synchronized关键字保护了count变量的读写操作,防止两个线程同时修改它的值。通过调用join()方法等待两个线程执行完毕后,输出count的值,可以看到最终输出的值是200000。
阅读全文