search
HomeJavajavaTutorialHow to directly call service business class in Java multi-threaded run method

You should pay attention to directly calling the service business class in the multi-threaded run method

Using the service business class in the Java multi-threaded run method will cause a java.lang.NullPointerException exception. This is due to the business class injected by spring. is null, or the direct new business object is also null.

Multi-threading will prevent injection for thread safety. Therefore, when you want to use the service business class, you need to use the ApplicationContext method to obtain the bean method to obtain the service class.

To obtain the ApplicationContext class, you must implement the ApplicationContextAware interface, as follows:

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
 
public class ApplicationContextUtil implements ApplicationContextAware {
 
	private static ApplicationContext context;
	public void setApplicationContext(ApplicationContext context) throws BeansException {
		this.context = context;
	}
	public static ApplicationContext getContext() {
		return context;
	}
}

Then use the above method in the run method to create a business object, as follows:

XXXServiceI xxxService = ApplicationContextUtil.getContext.getBean(XXXServiceI.class);

This way it can be used normally The business class is over.

The diagram is as follows

How to directly call service business class in Java multi-threaded run method

How to directly call service business class in Java multi-threaded run method

How to directly call service business class in Java multi-threaded run method

#Multi-threading knowledge points

Four ways to start threads

1. Inherit the Thread class and rewrite the run method of Thread, perform operations in the run method, and use the start method to start the thread

How to directly call service business class in Java multi-threaded run method

2. Inherit the Runnable interface, implement the run method, and perform operations in the run method. You need to pass in the instance object of the current class to create a Thread instance, and then call the start method to start the thread

How to directly call service business class in Java multi-threaded run method

3. Implement the Callable interface and rewrite the call() method. It should be noted that the first two methods do not require a response and are executed directly. However, if you implement the Callable interface and rewrite the call() method, You need to wait for the thread to respond, so although other threads are started, one thread is executing, and it cannot be considered a standard multi-thread.

How to directly call service business class in Java multi-threaded run method

4. Thread pool

How to directly call service business class in Java multi-threaded run method

#Use @Aysnc annotation to implement multi-threading

The same class , method A refers to method B. Adding asynchronous @Async annotation to method B will not be effective

The added @Async method and the caller cannot be in the same class

The difference between user threads and daemon threads

Threads created in Java default to creating user threads, such as new Thread (thread object).start

    Thread thread = new Thread();
    // 默认为false,都是用户线程
    thread.setDaemon(true); // 表示设置为守护线程
    thread.setDaemon(false); // 表示设置为用户线程

  • User thread: No It dies as other threads die. There are only two situations where it dies. One is that it terminates due to an exception during operation, and the other is that the program is executed normally and the thread dies

  • Daemon thread: Dies as the user thread dies. When the user thread dies, the daemon thread also dies, such as the gc garbage collection thread. If the user thread exists, then gc needs to be alive, otherwise it will be useless.

Six states of threads

1. New: Initial state, the thread is created, start() is not called

2. Runnable: Run Status, Java threads call the two states of ready and running in the operating system "running"

3. Blocked: blocked, the thread enters the waiting state, and the thread gives up the use of the CPU for some reason

  • Several situations of blocking:

  • A. Waiting for blocking: The running thread executes wait(), and the JVM will Put it in the waiting queue

  • B. Synchronous blocking: When the running thread acquires the synchronization lock of the object, if the synchronization lock is occupied by other threads, the JVM will put the current thread into the lock Pool

  • C. Other blocking: When the running thread executes sleep(), join() or issues an IO request, the JVM will set the current thread to the blocking state. When sleep() After execution, the join() thread terminates, and the thread resumes again after IO processing

4. Waiting: waiting state

5. timed_waiting: timeout waiting state, automatically after timeout Return

6. terminated: Termination status, the current thread has completed execution

Reentrancy of Java lock

The reentrancy mechanism of Java lock can solve the following problem , go directly to the code:

 public class Demo1 {
    public synchronized void functionA(){
        System.out.println("iAmFunctionA");
        functionB();
    }
    public synchronized void functionB(){
        System.out.println("iAmFunctionB");
    }

Assume that Java does not provide a synchronized internal lock mechanism that forces atomicity: functionA() and functionB() are both synchronized methods. When the thread enters funcitonA(), it will obtain the object lock of this class. , this lock "new Demo1()" calls the method functionB() in functionA(), but functionB() is also synchronized, so the thread needs to obtain the object lock (new Demo1()) again, but the JVM will It is considered that this thread has acquired the lock of this object and cannot acquire it again, so it cannot call the functionB() method, causing a deadlock.

Four rejection strategies of thread pool

When the task cache queue of the thread pool is full and the number of threads in the thread pool reaches maximumPoolSize, if there are still tasks arriving, the task rejection strategy will be adopted. Usually there are The following four strategies:

ThreadPoolExecutor.AbortPolicy: Discard the task and throw RejectedExecutionException.

ThreadPoolExecutor.DiscardPolicy: Discard the task, but do not throw an exception.

ThreadPoolExecutor.DiscardOldestPolicy: Discard the frontmost task of the queue, and then resubmit the rejected task

ThreadPoolExecutor.CallerRunsPolicy: By the calling thread ( The thread that submitted the task) processes the task

The difference between sleep and wait

  • sleep is a method in the thread, but wait is a method in Object

  • The sleep method will not release the lock, but wait will release it and will be added to the waiting queue

  • sleep does not need to be awakened, but wait does

Why wait(), notify(), notifyAll() are in the object and not in the Thread class

The lock level in java is the object level instead of the thread level. Each object has a lock, which is obtained through the thread. If the wait() method is in a thread, it is not obvious which lock the thread is waiting for.

The above is the detailed content of How to directly call service business class in Java multi-threaded run method. For more information, please follow other related articles on the PHP Chinese website!

Statement
This article is reproduced at:亿速云. If there is any infringement, please contact admin@php.cn delete
How does IntelliJ IDEA identify the port number of a Spring Boot project without outputting a log?How does IntelliJ IDEA identify the port number of a Spring Boot project without outputting a log?Apr 19, 2025 pm 11:45 PM

Start Spring using IntelliJIDEAUltimate version...

How to elegantly obtain entity class variable names to build database query conditions?How to elegantly obtain entity class variable names to build database query conditions?Apr 19, 2025 pm 11:42 PM

When using MyBatis-Plus or other ORM frameworks for database operations, it is often necessary to construct query conditions based on the attribute name of the entity class. If you manually every time...

How to use the Redis cache solution to efficiently realize the requirements of product ranking list?How to use the Redis cache solution to efficiently realize the requirements of product ranking list?Apr 19, 2025 pm 11:36 PM

How does the Redis caching solution realize the requirements of product ranking list? During the development process, we often need to deal with the requirements of rankings, such as displaying a...

How to safely convert Java objects to arrays?How to safely convert Java objects to arrays?Apr 19, 2025 pm 11:33 PM

Conversion of Java Objects and Arrays: In-depth discussion of the risks and correct methods of cast type conversion Many Java beginners will encounter the conversion of an object into an array...

How do I convert names to numbers to implement sorting and maintain consistency in groups?How do I convert names to numbers to implement sorting and maintain consistency in groups?Apr 19, 2025 pm 11:30 PM

Solutions to convert names to numbers to implement sorting In many application scenarios, users may need to sort in groups, especially in one...

E-commerce platform SKU and SPU database design: How to take into account both user-defined attributes and attributeless products?E-commerce platform SKU and SPU database design: How to take into account both user-defined attributes and attributeless products?Apr 19, 2025 pm 11:27 PM

Detailed explanation of the design of SKU and SPU tables on e-commerce platforms This article will discuss the database design issues of SKU and SPU in e-commerce platforms, especially how to deal with user-defined sales...

How to set the default run configuration list of SpringBoot projects in Idea for team members to share?How to set the default run configuration list of SpringBoot projects in Idea for team members to share?Apr 19, 2025 pm 11:24 PM

How to set the SpringBoot project default run configuration list in Idea using IntelliJ...

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

Atom editor mac version download

Atom editor mac version download

The most popular open source editor

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment