Directorio de artículos
1. Multihilo
1. Heredar la clase Thread (método 1)
1) Implementar subprocesos múltiples
Herede la clase Thread,
anule el método run(),
cree un objeto thread y
llame al método start() para comenzar
Llamar al método de ejecución se ejecutará como un método normal, y solo llamar al método de inicio iniciará un nuevo hilo para su ejecución.
2) Ventajas y desventajas
- ventaja
La codificación es simple
- defecto
Es una herencia única.Después de que la clase thread hereda Thread, no puede heredar otras clases, lo cual no es fácil de extender.
2. Implementar la interfaz Runnable (método 2)
1) Implementar subprocesos múltiples
Defina una clase de tarea de hilo MyRunnable para implementar la interfaz Runnable, reescriba el método run(),
cree un objeto MyRunnable
, entregue el objeto de tarea MyRunnable al objeto de hilo Thread para su procesamiento
, llame al método start() del objeto de hilo para comenzar la amenaza
2) Implementar subprocesos múltiples (método de clase interna anónimo)
Cree un objeto de clase interna anónimo de Runnable y
entrégueselo a Thread para que lo procese
. Llame a start() del objeto de hilo para iniciar el hilo.
3) Ventajas y desventajas
- ventaja
Implementa la interfaz de Runnale y puede continuar heredando e implementando
- defecto
El hilo tiene un resultado de ejecución y no puede regresar directamente
3. Implementar interfaces Callable y FutureTask (método 3)
1) Implementar subprocesos múltiples
Cree la clase de implementación de la interfaz Callable, reescriba el método call() y encapsule
el objeto Callable en un objeto de tarea de subproceso con FutureTask. El
objeto de tarea de subproceso se entrega a Thread para su procesamiento, y se llama al método start() para iniciar el hilo
Después de completar la ejecución de la tarea, el método get para obtener el resultado de la ejecución de la tarea
2) Ventajas y desventajas
- ventaja
La clase de tarea de subproceso solo implementa la interfaz y puede continuar heredando la clase e implementando la interfaz, que es altamente extensible.
Puede obtener el resultado de la ejecución del subproceso después de ejecutar el subproceso.
- defecto
La codificación es complicada
nombre del método | explique |
---|---|
public FutureTask<>(Callable call) |
Encapsule el objeto Callable en un objeto FutureTask |
public V get() throws Exception |
Obtenga el resultado devuelto por el hilo que ejecuta el método de llamada |
4. Hilo de rosca
1) Constructor de hilo
Constructor | explique |
---|---|
public Thread(String name) |
Especificar un nombre para el hilo actual |
public Thread(Runnable target) |
Encapsular un objeto ejecutable en un objeto de subproceso |
public Thread(Runnable target ,String name ) |
Encapsule el objeto Runnable en un objeto de subproceso y especifique el nombre del subproceso |
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Runnable "+Thread.currentThread().getName()+" ===>> "+i);
}
}
}
public class ClassStructure {
public static void main(String[] args){
MyRunnable myRunnable = new MyRunnable();
//分配一个带有指定目标新的线程对象
Thread thread = new Thread(myRunnable);
//获取当前线程名称
String name = thread.getName();
System.out.println("当前名称-1:"+name);
//设置新的名称
thread.setName("Thread-1-新");
String newName = thread.getName();
System.out.println("当前名称-1:"+ newName);
//启动多线程
thread.start();
MyRunnable mr = new MyRunnable();
//分配一个带有指定目标新的线程对象并指定名称
Thread td = new Thread(mr,"指定名称:");
String strName = td.getName();
System.out.println("当前名称-2:"+ strName);
td.start();
}
}
5. Método de hilo
1) El subproceso obtiene y establece el nombre del subproceso
nombre del método | explique |
---|---|
String getName() |
Obtenga el nombre del hilo actual, el nombre predeterminado del hilo es Thread-index |
void setName(String name) |
Cambie el nombre de este subproceso al nombre especificado, el nombre del subproceso también se puede establecer a través del constructor |
public class ClassStructure {
public static void main(String[] args){
Thread thread = new Thread();
String name = thread.getName();
System.out.println(name);
thread.setName("线程1");
String nameNew = thread.getName();
System.out.println(nameNew);
}
}
2) La clase Thread obtiene el objeto del hilo actual
nombre del método | explique |
---|---|
public static Thread currentThread() |
Devuelve una referencia al objeto de subproceso que se está ejecutando actualmente. |
Aviso:
1. Este método es un método estático de la clase Thread y se puede llamar directamente usando la clase Thread.
2. Qué objeto de subproceso se obtiene cuando se llama a este método en qué ejecución de subproceso.
public class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
super.run();
for (int i = 0; i < 10; i++) {
//获得当前正在执行的线程对象
Thread td = Thread.currentThread();
//获取当前线程名称
System.out.println(td.getName() + i);
}
}
}
3) El método de suspensión de hilos de la clase Thread:
nombre del método | explique |
---|---|
public static void sleep(long time) |
Deje que el subproceso actual entre en reposo durante el tiempo especificado antes de continuar con la ejecución, en milisegundos |
public class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
super.run();
for (int i = 0; i < 10; i++) {
//获得当前正在执行的线程对象
Thread td = Thread.currentThread();
//获取当前线程名称
System.out.println(td.getName() + i);
}
}
}
public class ClassStructure {
public static void main(String[] args) throws InterruptedException {
MyRunnable mr = new MyRunnable();
//分配一个带有指定目标新的线程对象并指定名称
Thread td = new Thread(mr,"指定名称:");
String strName = td.getName();
System.out.println("当前名称-2:"+ strName);
System.out.println(System.currentTimeMillis());
//暂停3秒
Thread.sleep(3000);
System.out.println(System.currentTimeMillis());
td.start();
}
}
2. Seguridad de hilos
Múltiples subprocesos acceden al mismo recurso compartido al mismo tiempo y modifican el recurso
3. Sincronización de subprocesos
- concepto
Solucionar problemas de seguridad de subprocesos
- Seguridad de hilo garantizada
Múltiples subprocesos pueden acceder a recursos compartidos uno tras otro, lo que puede resolver problemas de seguridad
- Pensamiento
Bloqueo: permitir que múltiples subprocesos accedan a recursos compartidos uno tras otro puede resolver problemas de seguridad
1. Bloque de código sincronizado
- principio
Solo un subproceso puede ingresar a la vez. Una vez que se completa la ejecución, se desbloquea automáticamente y otros subprocesos pueden ingresar y ejecutarse.
- efecto
El código central de los problemas de seguridad de subprocesos está bloqueado
- lograr la seguridad del hilo
El código central en cuestión es usar sincronizado para bloquear,
y solo un subproceso puede ocupar el bloqueo y entrar en ejecución a la vez.
- Formato
synchronized(同步锁对象) {
操作共享资源的代码(核心代码)
}
- Requisitos del objeto de bloqueo de sincronización
Para los métodos de instancia, se recomienda utilizarlo como objeto de bloqueo.
Para los métodos estáticos, se recomienda utilizar el objeto bytecode (nombre de clase.clase) como objeto de bloqueo.
2. Método de sincronización
- principio
Solo un subproceso puede ingresar a la vez. Una vez que se completa la ejecución, se desbloquea automáticamente y otros subprocesos pueden ingresar y ejecutarse.
- efecto
El código central de los problemas de seguridad de subprocesos está bloqueado
- Formato
- lograr la seguridad del hilo
El código central en cuestión es usar sincronizado para bloquear,
y solo un subproceso puede ocupar el bloqueo y entrar en ejecución a la vez.
修饰符 synchronized 返回值类型 方法名称(形参列表) {
操作共享资源的代码
}
- Requisitos del objeto de bloqueo de sincronización
Para los métodos de instancia, se recomienda utilizarlo como objeto de bloqueo.
Para los métodos estáticos, se recomienda utilizar el objeto bytecode (nombre de clase.clase) como objeto de bloqueo.
- principio subyacente
Si el método es un método de instancia: el método sincronizado lo usa como objeto de bloqueo de forma predeterminada. Pero el código debe estar muy orientado a
objetos.Si el método es un método estático: el método de sincronización utiliza el nombre de clase .class como objeto de bloqueo de forma predeterminada.
3. Bloquear
- principio
El objeto de bloqueo Lock es más flexible y cómodo de usar.
La implementación de bloqueo proporciona una gama más amplia de operaciones de bloqueo que el uso de métodos y declaraciones sincronizados. El
bloqueo es una interfaz que no se puede instanciar directamente. Aquí, su clase de implementación ReentrantLock se usa para construir un bloqueo objeto de bloqueo
nombre del método | explique |
---|---|
public ReentrantLock() |
Obtenga el objeto de clase de implementación del bloqueo de bloqueo |
void lock() |
cerrar |
void unlock() |
desbloquear |