线程的流程:
生成线程 进入就绪状态 一起抢占执行的cpu 进入运行
然后又被抢走后进入就绪
阻塞事件:网络请求时受阻,进入阻塞,停止,当有了后几就解除阻塞进入就绪状态,然后再继续抢占CPU
java 里的线程,面向对象中,所有东西都是对象。
所以,线程也要生成对象
创建线程的方法:
方式 1:extends Thread
继承类 Thread,复写run(),run()里的代码就是线程体,就是线程执行的代码
线程编程最痛苦的是:线程切换运行没有规律可循
有的错误,只是在特定的运行顺序会出错,所以,多线程的错误不好找
方式2: implement Ruunable()
实现接口Runnable()
class RunnableImpl implements Runnable {
public void run(){
for(int i =0;i<10;i++){
System.out.println("RunnableImpl" +i);
try{
if(i==5){
Thread.sleep(5000);
}
}
catch (Exception e){
System.out.println(e);
}
}
}
}
主函数: test.java:
class test{
public static void main (String args[]){
//Runnable 接口实现类的对象 2.生产一个Thread对象,并将Runnable类的实现类作为参数
//传递给Thread的构造函数 给Thread 的对象 3.开启线程
RunnableImpl ri =new RunnableImpl();
Thread th =new Thread(ri);
th.setPriority(Thread.MAX_PRIORITY);
System.out.println(th.getPriority());
th.start();
}
}
这里:th 是线程对象,ri代表线程体
注意: 一旦extends Thread,就无法继承其他类了
所以 ,偏向第二种
二:控制现成的常见的函数
线程的简单控制方法:
初步了解线程控制一般思路和一般应该考虑的问题。
中断线程:
------Thread.sleep()
注意:
休眠后,就要进入就绪,开始争夺CPU的时间,而不是一结束休眠就可以执行。
------Thread.yield():
自动让出CPU,再去抢这个CPU。发红包的感觉
1.设置线程的优先级
setPriority()
getPriority)
th.setPriority(Thread.MAX_PRIORITY);
System.out.println(th.getPriority());
三:线程的同步:造成数据安全性问题的解决方法:
生成2个Thread对象,这2个Thread对象共用一个线程体:MyThread
class test{
public static void main (String args[]){
MyThread myThread =new MyThread();
Thread th1 =new Thread(myThread);
th1.setName("Thread01");
Thread th2 =new Thread (myThread);
th2.setName("Thread02");
th1.start();
th2.start();
}
}
线程体的定义:
class MyThread implements Runnable {
int i =100;
public void run(){
while(true){
synchronized (this){
System.out.println(Thread.currentThread().getName()+i);
i--;
Thread.yield();
if(i<0){
break;
}
}
}
}
}
synchronized(this):中this类似一把锁,
线程A得到了CPU之后,执行代码块,执行过程中,被线程B抢占了CPU,但是,线程B一看this被占用了,只能watting ,此时线程A又继续执行,一直到执行完之后,释放锁,然后,线程B才执行
注意:得到锁后,不是一直执行代码块不被打扰,而是与其他线程抢占CPU后,又来执行代码块,让其他人等待
每个线程都有名字,可以通过Thread对象setName()设置名字,getName()获得名字
while:先检查()为真,就执行循环体
while(true){
break ;//跳出循环}
currentThread()当前Thread在哪个线程运行。返回的是一个Thread对象,即代表当前代码运行在的线程。
同步代码块。解决线程的同步问题引起的数据安全问题:
//数组的静态声明
int arr [] =new int[10];
动态数组:
//数组的动态声明
char arrchar [] =new char[10]
//数组的静态声明
int arr [] =new int[10];
动态数组:
//数组的动态声明
char arrchar [] =new char[10]
二维数组: int arr[][] ={{1,2,3},{2,3,4},{3,4,5}};
矩阵:类似
arr[0][1]