Al implementar subprocesos múltiples, si varios subprocesos acceden a la misma variable, como cadenas de salida, y hay varias declaraciones de salida, es probable que ocurra esta situación: A es la mitad de la salida y B se inserta nuevamente. Salida, y luego se inserta otro hilo, entonces la salida se volverá confusa
Por ejemplo
Puedes ver que las oraciones de salida se cruzan entre sí
import java.util.concurrent.*;
class printThread extends Thread {
String thname;
printThread(String threadName) {
this.thname = threadName;
}
public void run() {
System.out.print("0123456789");
System.out.print("abcdefg");
System.out.print("ABCDEFG");
System.out.print("HelloWorld");
System.out.print("7777777");
System.out.print("XiaoXinMaZiLi");
System.out.println();
}
}
public class mutilThread {
public static void main(String[] args) {
ExecutorService pool = Executors.newCachedThreadPool();
for(int i=0; i<100; i++) {
printThread pt = new printThread(i+"");
pool.submit(pt);
}
pool.shutdown();
}
}
La palabra clave sincronizada implementa bloques de código sincronizado
El hilo actual y el acceso es Obj
, estarán Obj
en funcionamiento en alrededor de la mitad de la declaración, se puede lograr Obj
la sincronización, que al mismo tiempo, sólo por una operación de rosca objetivo Obj
objetos
synchronized(Obj) {
// 要对 Obj 对象操作的语句
}
public void run() {
synchronized(System.out) {
System.out.print("0123456789");
System.out.print("abcdefg");
System.out.print("ABCDEFG");
System.out.print("HelloWorld");
System.out.print("7777777");
System.out.print("XiaoXinMaZiLi");
System.out.println();
}
}
Por ejemplo
import java.util.concurrent.*;
class printThread extends Thread {
String thname;
printThread(String threadName) {
this.thname = threadName;
}
public void run() {
synchronized(System.out) {
System.out.print("0123456789");
System.out.print("abcdefg");
System.out.print("ABCDEFG");
System.out.print("HelloWorld");
System.out.print("7777777");
System.out.print("XiaoXinMaZiLi");
System.out.println();
}
}
}
public class mutilThread {
public static void main(String[] args) {
ExecutorService pool = Executors.newCachedThreadPool();
for(int i=0; i<100; i++) {
printThread pt = new printThread(i+"");
pool.submit(pt);
}
pool.shutdown();
}
}