java多线程基础 什么是进程?
进程是操作系统的结构,是一次程序的执行;是一个程序及其数据在处理机上的顺序执行时所发生的活动,是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
什么线程
线程可以理解成是在进程中独立运行的子文件,比如你的电脑qq运行时就有很多的子任务在同时运行。比如好友视频线程,下载文件线程,传输数据线程,发送表情进程等,这么做的优点是,可以最大限幅使用cpu资源,比如一边用操作系统处理正在由打印机打印数据一边用word写文档。而cpu这些任务之间不停切换,由于切换速度非常快,所以给用户一种同时都在隐形的感觉。所以运用多线程技术以后可以在同一时间内运行更多的不同种类的任务
让我们先接触一个线程
/**
* Created by likailong on 2016/10/24.
* 结果分析 使用多线程技术 代码的运行结果和代码的执行顺序无关 cpu以不确定的方式
* 注意如果多次调用start会报出illegalThreadStateException
*/
public class MyTnread extends Thread {
public void run(){
super.run();
System .out.println("Mythread");
}
public static void main(String args[]){
MyTnread myTnread=new MyTnread();
myTnread.start();
System.out.println("运行结束");
}
}
线程运行的随机性检测
package com.company.javaThreadTest;
/**
* Created by likailong on 2016/10/24.
* class Thread implements Runnable
* 因此建立一个线程实现runnable接口就可以
* 线程具有随机特性
*/
public class MyThead1 extends Thread {
public void run(){
try{
for(int i=0;i<10;i++){
int time=(int)(Math.random()*1000);
Thread.sleep(time);
System.out.println("run ="+Thread.currentThread().getName());}
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String [ ] args){
try{
MyThead1 my=new MyThead1();
my.setName("my thread");
my.start();
for(int i=0;i<10;i++){
int time=(int)(Math.random()*1000);
Thread.sleep(time);
System.out.println("main="+Thread.currentThread().getName());
}}catch (InterruptedException e){
e.printStackTrace();
}
}
}
结果展示
实例变量与线程安全
package com.company.javaThreadTest;
/**
* Created by likailong on 2016/10/24.
* 实例变量与线程安全
* 实例变量线程不共享测试
*
*/
public class Mythread2 extends Thread{
private int count=5;
public Mythread2(String name){
super();
this.setName(name);
}
public void run(){
super.run();
while (count>0){
count--;
System.out.println("有"+this.currentThread().getName()+"计算,count="+count);
}
}
public static void main(String [] args){
Mythread2 mythread2=new Mythread2("A");
Mythread2 mythread1=new Mythread2("B");
Mythread2 mythread3=new Mythread2("C");
mythread1.start();
mythread2.start();
mythread3.start();
}
}
局部变量共享
package com.company.javaThreadTest;
/**
* Created by likailong on 2016/10/24.
*/
public class Mythread3 extends Thread {
private int count=5;
public Mythread3(String name){
super();
this.setName(name);
}
synchronized public void run(){
super.run();
count--;
System.out.println("有"+this.currentThread().getName()+"计算,count="+count);
}
public static void main(String [] args){
Mythread3 mythread1=new Mythread3("a");
Mythread3 mythread2=new Mythread3("b");
Mythread3 mythread3=new Mythread3("c");
Mythread3 mythread4=new Mythread3("d");
Mythread3 mythread5=new Mythread3("e");
mythread1.start();
mythread2.start();
mythread3.start();
mythread4.start();
mythread5.start();
}
}
共享数据出现线程安全问题
解决方法加synchronized关键字