标签:sch bubuko inter strong 优先 ted 线程二 runnable 设计
java多线程:
实现多线程的两种方式:
1:继承Thread类,重写run方法:
自定义Mythread类,继承Thread;
public class MyThread extends Thread {
/*
* 为什么要重写run();方法呢????
* 因为run方法;里面封装的线程执行的代码;
*/
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("开始");
System.out.println(getName() + "---" + i);
}
}
}
测试以及多线程的常用方法:
@Test
public void test() throws InterruptedException {
MyThread myThread = new MyThread();
MyThread myThread2 = new MyThread();
//设置线程的名字:
myThread.setName("线程一");
myThread2.setName("线程二");
//获取当前线程的名字:
String name = Thread.currentThread().getName();
System.out.println(name);
myThread.start();
myThread2.start();
/*
* start()与run()方法的区别:
* run()直接调用仅仅是普通方法,start()先加载进程,在加载run方法;
*/
//设置线程的优先级;(级别:1-10级,级别越小,抢占到cpu时间片的时间越多!默认级别是:5)
myThread.setPriority(10);
myThread2.setPriority(1);
//线程的休眠:
myThread.sleep(1000);
//线程的加入:
myThread.join();//加入线程后,会先执行完该线程,在加载后面要执行的线程;
}
2:实现Runnable接口,重写run方法:
public class MyThread2 implements Runnable {
@Override
public void run() {
for(int i=0;i<100;i++){
System.out.println(Thread.currentThread().getName()+"---"+i);
}
}
}
测试:
public class ThreadTest2 {
@Test
public void test(){
MyThread2 myThread2 = new MyThread2();
Thread thread = new Thread(myThread2);
Thread thread2 = new Thread(myThread2);
thread.start();
thread2.start();
}
}
这两种方法的区别:
在实际开发中主要使用第二种,即实现Runnable接口,
优势:1:解决了方式一中的单继承问题(即一个类继承了Thread后就不能继承其他类了),
2:适合多个相同程序去操作同一的资源的情况,把线程的代码和程序有效的进行数据分离,较好的体现了面向对象的设计思 想。
4:多线程的常用方法:
1 : 设置线程的名字:setName();
2: 获取线程的名字:getName();
3 : 获取当前线程对象再获取名字:Thread.CurrentThread.getName();
4 : 线程的优先级:setPriority(); 最小-----最大(1---10),默认是5级;
5: 线程的礼让: yield(); 让多个线程执行得更加和谐,比如:线程1执行一次,线程2执行一次。。。。。但是也会出现问题;
6 : 线程的休眠: sleep(); 相当于让线程暂停一会儿,时间是毫秒;
7 : 加入线程 : join(); 加入线程后会先执行完该线程,再执行其他的线程;
8 : 中断线程: stop(); 或者 interrupt(); 一般都使用interrupt();
9 : 后台线程 : setDaemon(true); : 将该线程标记为守护线程或者用户线程,作用:当运行的线程都是守护线程时,虚拟机(JVM)会退出,停止执行。该方法必须在启动线程前调用。
5:线程的生命周期:
6:线程的安全问题:
eg: 卖票问题:
1:多个线程运行时,导致同一张票被卖了多次????
CPU的操作必须是原子性的。
2:出现了负数票????
由于线程的随机性和网络延迟导致的。
分析:出现线程安全问题的原因:
1:多线程环境 2:有数据的共享(在某个时间内线程都进行操作的数据) 3:有多条语句操作共享数据
7:线程安全问题的解决:
1:同步代码块:
格式 : Syschronized (对象) { 需要同步的代码块
}
同步代码块解决问题的根本原因就在 “对象” 上,如同锁的功能;
该对象可以是任意的对象;一般是定义一个成员变量:
// 创建锁:
private Object obj = new Object();
把 obj 放入上面的(对象)中即可;
同步的特点:前提是多线程;使用同一个锁对象(obj);
同步的弊端:每个线程都回去判断同步上的锁,比较耗费资源,会降低程序的运行效率。
2:同步方法:
把同步关键字加在方法上:eg: public Syschronized void ThreadTest();
锁对象用this关键字表示;
2-2 静态方法及所对象问题?
静态方法的锁对象:类的字节码文件对象(类 . class);
标签:sch bubuko inter strong 优先 ted 线程二 runnable 设计
原文地址:https://www.cnblogs.com/dw3306/p/9465473.html