多线程
前言:学完多线程,感觉有点难??????????
java.lang.Thread
创建线程的方式:
public class ThreadTest {
//1.通过继承Thread创建线程对象
public static void main(String[] args) {
// MyThr m = new MyThr();
// m.start();
// for(int i=0;i<20;i++)
// System.out.println("我是main方法");
//2.通过实现Runnalbe接口创建线程对象
MyThr1 m1 = new MyThr1();
Thread t = new Thread(m1);
t.start();
for(int i=0;i<20;i++)
System.out.println("我也是main方法");
}
}
class MyThr extends Thread{
public void run() {
for(int i=1;i<=5;i++) {
System.out.println("我是线程对象");
}
}
}
class MyThr1 implements Runnable{
@Override
public void run() {
for(int i=1;i<=5;i++) {
System.out.println("我也是线程对象");
}
}
}
构造器
Constructor | Description |
---|---|
Thread() | Allocates a new Thread object. |
Thread(Runnable target) | Allocates a new Thread object. |
Thread(Runnable target, String name) | Allocates a new Thread object. |
Thread(String name) | Allocates a new Thread object. |
Thread中的三个静态属性
MAX_PRIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5
常见方法
返回值 | 方法名 | 作用 |
---|---|---|
static Thread | currentThread() | 返回当前正在执行的线程对象的引用 |
String | getName() | 返回此线程的名字 |
int | getPriority() | 返回此线程的优先级 |
void | interrupt() | 中断此线程 |
boolean | isAlive() | 测试此线程是否存活 |
boolean | daemon() | 测试是否为守护线程 |
返回值 | 方法名 | 作用 |
---|---|---|
void | join() | 某个线程加入,等待加入的线程死亡 |
void | setName(String name) | 修改线程名 |
void | setPriority(int p) | 修改优先级 |
static void | sleep(long millis) | 使线程休眠的毫秒数 |
static void | yield() | 将线程占用的资源让出去 |
生命周期
线程的同步策略
synchronized
加锁机制:(有待学习)
public class ThreadTest2 {
public static void main(String[] args) {
for (int i = 65; i < 70; i++) {
new TicketThread("窗口" + (char) i).start();
}
}
}
class TicketThread extends Thread {
static int count = 10;
public TicketThread(String name) {
super(name);
}
public void run() {
for (int i = 0; i < 10; i++) {
synchronized ("1") {
if (count > 0) {
try {
Thread.sleep(2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(this.getName() + "正在售票" + (count--));
}
}
}
}
}
volatile
多线程的内存模型:main memory内存,working memory线程栈。在处理数据时,线程会把内存中值从内存load到本地,完成操作后再save回去
volatile关键字的作用:每次针对该变量的操作都激发一次load and save
针对多线程使用的变量如果不是volatile修饰的,很有可能会出错(另一个线程修改了这个值,但是之后在某线程看到的值是修改之前的值)
public class ThreadTest3 {
public static void main(String[] args) {
T t = new T();
t.start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.flag = false;
}
}
class T extends Thread {
volatile boolean flag = true;
@Override
public void run() {
System.out.println("while循环开始了。。。。。。");
while (flag) {
}
System.out.println("while循环结束了了。。。。。。");
}
}
@Override
public void run() {
System.out.println("while循环开始了。。。。。。");
while (flag) {
}
System.out.println("while循环结束了了。。。。。。");
}
}