Java多线程编程
1.多线程涉及在并发的情况下对多核等硬件潜力更有效的使用,且人们对程序的处理速度要求不断提升,因此多线程编程几乎成为了绝大多数程序的基本特征,生产环境下一定会使用多线程;
2.Java中main方法是运行在主线程中的!
3.创建和使用线程的两种方式:直接覆写Thread的run方法以及传入Runnable接口对象给Thread的构造器
//直接覆写Thread的run方法
lass HelloThread extends Thread {
@Override
public void run() {
super.run();
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
}
}
//传入Runnable接口对象给Thread的构造器
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 5;i++){
System.out.println(i);
}
}
}).start();
4.实际生产环境下,一般单独使用Runnable的具体实现类来封装业务逻辑部分
//单独使用Runnable的具体实现类来封装业务逻辑部分
class MyLogic implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10;i++){
System.out.println(i);
}
}
}
5.使用setDaemon方法把一个线程设置为后台线程,Daemon线程必须依附于前台线程才能够存在;
6.默认情况下开辟的线程都是前台线程,(主线程当然是前台线程,如果有前台线程一般不会退出)在运行的时候,系统默认情况下不会回收该线程,即使主线程已经不存在的情况下;
7.主线程退出的一个明显的标记是main方法执行结束;
8.使用join方法可以让有个线程强制执行,线程强制执行的时候其他线程无法运行,必须等待此线程运行完毕后才可以以运行;
9.使用sleep方法让线程休眠;
10.使用interrupt方法中断正在运行的线程
11.使用setPriority来设置线程的优先级,优先级范围是1-10,main所在的main线程的优先级是5;
12.使用yield的方法将一个线程的操作暂时礼让给其他线程执行;
13.Sysnchronized(同步代码块)
public class JavaThread {
public static void main(String[] args){
TicketLogicThread saleTicket = new TicketLogicThread();
Thread t1 = new Thread(saleTicket);
Thread t2 = new Thread(saleTicket);
Thread t3 = new Thread(saleTicket);
Thread t4 = new Thread(saleTicket);
Thread t5 = new Thread(saleTicket);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
class TicketLogicThread implements Runnable{
private int ticket = 10;
@Override
public void run() {
for (int i = 0; i < 2;i++){
synchronized (this){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Ticket ID: "+ticket-- +" ThreadNum: "+Thread.currentThread().getName());
}
}
}
}
14.在方法前面加上Sysnchronized关键字变成同步方法
完整示例:
/**
* FileName: JavaThread
* Author: hadoop
* Email: 3165845957@qq.com
* Date: 18-10-3 下午3:28
* Description:
*/
public class JavaThread {
public static void main(String[] args){
Thread helloThread = new HelloThread(); //启动线程
helloThread.setPriority(Thread.NORM_PRIORITY);
helloThread.start();
helloThread.interrupt();
new Thread(new MyLogic()).start();
Thread thread = new Thread(new MyLogic());
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(thread.getName());
System.out.println("Priority : "+thread.getPriority());
System.out.println(Thread.currentThread().getName());*/
TicketLogicThread saleTicket = new TicketLogicThread();
Thread t1 = new Thread(saleTicket);
Thread t2 = new Thread(saleTicket);
Thread t3 = new Thread(saleTicket);
Thread t4 = new Thread(saleTicket);
Thread t5 = new Thread(saleTicket);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
class HelloThread extends Thread {
@Override
public void run() {
super.run();
for (int i = 0; i < 5; i++) {
System.out.println(i);
if (i == 3)
interrupt();
}
}
}
class MyLogic implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
}
}
class TicketLogicThread implements Runnable{
private int ticket = 10;
@Override
public void run() {
for (int i = 0; i < 2;i++){
synchronized (this){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Ticket ID: "+ticket-- +" ThreadNum: "+Thread.currentThread().getName());
}
}
}
}