java多线程基础
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java多线程基础,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5904字,纯文字阅读大概需要9分钟。
内容图文
![java多线程基础](/upload/InfoBanner/zyjiaocheng/619/71c2ae4a9f7741b1a7a199c47927972e.jpg)
1.线程创建
1 继承 Thread 类
采用 Thread 类创建线程,用户只需要继承 Thread,覆盖 Thread 中的 run 方法,父类 Thread 中 的 run 方法没有抛出异常,那么子类也不能抛出异常,最后采用 start 启动线程即可2 实现runnable接口
其实 Thread 对象本身就实现了 Runnable 接口,但一般建议直接使用 Runnable 接口来写多线程 程序,因为接口会比类带来更多的好处
public class Test {
public static void main(String[] args) throws Exception{
// Person p = new Person();
//
// p.start();
// Thread.sleep(100);
Runnable r = new Person();
Thread t = new Thread(r);
r.run();
Thread.sleep(100);
}
}
//class Person extends Thread{
//
//
// @Override
// public void run() {
//
// for(int i=0; i < 10; ++i){
// System.out.println(i);
// }
// }
//}
class Person implements Runnable{
@Override
public void run() {
for(int i=0; i<10; ++i){
System.out.println(i);
}
}
}
2 线程的生命周期
- 新建:采用new语句创建
- 就绪:执行start()
- 运行:执行run()方法
- 阻塞:执行sleep()或者等待对象锁
- 消亡:run()方法执行结束
3,线程优先级
调度模型:
分时调度模型:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
抢占式调度模型:优先级高的线程获取 CPU 的时间片相对多一些,如果线程的优先级相同, 那么会随机选择一个 。
优先级设置:(优先级越高得到的cpu时间片就越多)
thread.setPriority(Thread.MAX_PRIORITY); (最高)
thread.setPriority(Thread.MIN_PRIORITY);(最低)
thread.setPriority(Thread.NOM_PRIORITY);(默认)
Thread.sleep() ,Thread.yield(),join()
1.Thread.sleep()让当前线程进入休眠状态
2.Thread.yield()让同级线程有执行机会
3,阻塞当前线程直到执行完毕
interrupt
如果线程正在睡眠时调用interrupt会导致该线程抛出interrupt异常
4,线程终止 通常定义一个标记,来判断标记的状态停止线程的执行
public class Test {
public static void main(String[] args) throws Exception{
Person r = new Person();
Thread t = new Thread(r);
t.start();
Thread.sleep(2000);
r.setFlag(true);
Thread.sleep(1);
}
}
class Person implements Runnable{
private boolean flag;
@Override
public void run() {
while(true){
System.out.println(Thread.currentThread().getName());
if(flag){
System.out.println("线程退出");
break;
}
}
}
public void setFlag(boolean flag){
this.flag = flag;
}
}
5,线程同步(加锁)
一下代码不存在线程安全,因为t3和t2属于访问自己工作内存中的局部变量,不会造成线程安全问题
public class Test {
public static void main(String[] args) throws Exception{
Runnable t1 = new Person();
Thread t2 = new Thread(t1,"t2");
t2.start();
Thread t3 = new Thread(t1,"t3");
t3.start();
}
}
class Person implements Runnable{
@Override
public void run() {
int s = 0;
for(int i = 0; i < 10; ++i){
s+=i;
}
System.out.println(Thread.currentThread().getName() + ", s=" + s);
}
}
一下代码存在线程安全问题,因为线程共享变量s,而这变量是在堆内存当中。所以可以使用synchronized关键字给对象加锁
public class Test {
public static void main(String[] args) throws Exception{
Runnable t1 = new Person();
Thread t2 = new Thread(t1,"t2");
t2.start();
Thread t3 = new Thread(t1,"t3");
t3.start();
}
}
class Person implements Runnable{
private int s = 0;
@Override
public void run() {
for(int i = 0; i < 10; ++i){
s+=i;
}
System.out.println(Thread.currentThread().getName() + ", s=" + s);
}
}
线程安全版本 (因为同步了代码块效率肯定会下降)
或者 为每一个线程创建一个对象来解决线程安全问题(让每一个线程都执行的是不同的对象,但是类变量仍然会有问题)
public class Test {
public static void main(String[] args) throws Exception{
Runnable t1 = new Person();
Thread t2 = new Thread(t1,"t2");
t2.start();
Thread t3 = new Thread(t1,"t3");
t3.start();
}
}
class Person implements Runnable{
private int s = 0;
@Override
public void run() {
synchronized (this) {
for (int i = 0; i < 10; ++i) {
s += i;
}
System.out.println(Thread.currentThread().getName() + ", s=" + s);
}
}
}
6,守护线程 (垃圾收集器)
7, 用户线程 主线程执行结束了,但用户线程仍然将数据打印出来了
8,将用户线程设置为守护线程后,当主线程退出后守护线程也会结束
public class Test {
public static void main(String[] args) throws Exception{
Runnable t1 = new Person();
Thread t2 = new Thread(t1,"t2");
t2.setDaemon(true);
t2.start();
System.out.println("主线程执行结束");
}
}
class Person implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; ++i) {
System.out.println(Thread.currentThread().getName() );
}
}
}
9,Timer定时器
Quartz 是用来定时启动任务10 ,未来任务
import java.io.*;
import java.text.*;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class Test {
public static void main(String[] args) throws Exception{
FutureTask task = new FutureTask(new Callable() {
@Override
public Object call() throws Exception {
Thread.sleep(1000*3);
return 0;
}
});
Thread t1 = new Thread(task);
t1.start();
Object o = task.get();
System.out.println(o);
}
}
11,生产者消费者模型
import java.io.*;
import java.text.*;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class Test {
public static void main(String[] args) throws Exception{
List<Integer> list = new ArrayList<>();
Runnable p = new Producer(list);
Runnable c = new Consumer(list);
Thread t1 = new Thread(p);
Thread t2 = new Thread(c);
t1.setName("t1");
t2.setName("t2");
t1.start();
t2.start();
}
}
class Producer implements Runnable{
private List list;
public Producer(List list){
this.list=list;
}
@Override
public void run() {
while(true){
synchronized(list){
if(list.size() > 0){
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "," + list.size());
list.add(10);
list.notifyAll();
}
}
}
}
class Consumer implements Runnable{
private List list;
public Consumer(List list){
this.list=list;
}
@Override
public void run() {
while(true){
synchronized (list){
if(list.size() == 0){
try {
list.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName() + "," + list.size());
list.remove(0);
list.notifyAll();
}
}
}
}
? ? ? ? ? ? ? ? ? ?
内容总结
以上是互联网集市为您收集整理的java多线程基础全部内容,希望文章能够帮你解决java多线程基础所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。