Java基础夯实之线程问题全面解析
什么是线程?
线程是计算机在执行程序时,处理器上的一个执行单元,每个线程之间都是互相独立的执行流。线程可以同时运行在同一个进程中的多个线程之间共享内存和其它资源,这样可以提高程序的并发性和运行效率。
为什么要使用线程?
使用线程可以提高程序的并发性和运行效率,同时通过将耗时的计算和IO操作放在单独的线程中可以保证主线程的流畅性。
线程的创建
线程的创建有两种方式:继承Thread类和实现Runnable接口。通常推荐使用实现Runnable接口的方式,因为它可以避免继承Thread类可能带来的一些限制。
继承Thread类
继承Thread类,需要实现线程的run()方法,这个方法是线程的主体,在线程启动后会自动执行。示例代码如下:
public class MyThread extends Thread{
@Override
public void run(){
System.out.println("This is a thread created by extending Thread class.");
}
}
实现Runnable接口
实现Runnable接口需要实现接口中的run()方法,同样是线程的主体,在线程启动后自动执行。示例代码如下:
public class MyRunnable implements Runnable{
@Override
public void run(){
System.out.println("This is a thread created by implementing Runnable interface.");
}
}
线程的启动
当线程对象创建完成后,需要调用start()方法启动线程。start()方法会自动调用run()方法,并使线程处于可运行状态。示例代码如下:
public static void main(String[] args){
MyThread myThread = new MyThread();
myThread.start();
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
}
线程的优先级
每个线程都有一个优先级,优先级是一个整数值,在1-10之间。当多个线程竞争CPU时,优先级高的线程会优先执行。Java使用setPriority()方法设置线程优先级。
优先级示例代码如下:
public static void main(String[] args){
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
MyThread myThread3 = new MyThread();
myThread1.setPriority(Thread.MIN_PRIORITY);
myThread2.setPriority(Thread.NORM_PRIORITY);
myThread3.setPriority(Thread.MAX_PRIORITY);
myThread1.start();
myThread2.start();
myThread3.start();
}
线程的同步
当多个线程同时访问共享资源时,会出现数据不一致的情况,这时需要使用同步机制来协调各个线程访问共享资源的顺序,Java提供了synchronized关键字和Lock对象来实现线程的同步。
synchronized关键字示例代码如下:
public synchronized void addCount(){
count++;
}
Lock对象示例代码如下:
Lock lock = new ReentrantLock();
public void addCount(){
lock.lock();
count++;
lock.unlock();
}
线程的通信
当一个线程需要与其他线程进行通信时,可以使用wait(), notify()和notifyAll()三个方法来实现线程的等待、唤醒和唤醒所有等待线程。
线程的通信示例代码如下:
public class Person{
private String name;
private int age;
private boolean flag;
public synchronized void set(String name, int age){
while (flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.name = name;
this.age = age;
this.flag = true;
this.notify();
}
public synchronized void get(){
while (!flag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(this.name + " " + this.age);
this.flag = false;
this.notify();
}
}
public class Test{
public static void main(String[] args){
Person p = new Person();
new Thread(()->{
int count = 1;
while(true) {
if (count % 2 == 0) {
p.set("小红", 18);
} else {
p.set("小明", 20);
}
count++;
}
}).start();
new Thread(()->{
while(true) {
p.get();
}
}).start();
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基础夯实之线程问题全面解析 - Python技术站