标签:reads 继承 线程并发 行业 over 类对象 相关 如何 进程
并发与并行进程:是一个内存中运行的应用程序,有自己独立的内存空间,一个应用程序至少有一个进程,一个进程至少有一个线程;
线程: 线程是进程中的一个执行单元,是CPU调度和分派的基本单位,能独立运行的基本单位,同一进程中的多个线程之间可以并发执行。
线程调度:
分时调度:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPUde 时间
主线程:
public class TheadTest extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++){
System.out.println(i);
}
}
TheadTest theadTest = new TheadTest();
theadTest.start();
多线程内存图解:
多个线程之间是互不影响的,因为在不同的栈空间
public class RunnableThead implements Runnable {
@Override
public void run() {
for (int i = 0; i < 5 ; i++) {
System.out.println(i);
}
}
RunnableThead runnableThead = new RunnableThead();
new Thread(runnableThead).start();
- Runnable接口创建多线程和继承Thread类创建多线程的区别:
@Test
public void testThread(){
new Thread("线程一"){
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(getName()+i);
}
}
}.start();
}
@Test
public void testRunnable(){
new Thread( new Runnable(){
@Override
public void run() {
System.out.println("匿名线程");
}
}).start();
}
public class TicketThead extends Thread{
public static void saleTicket(String ThreadName){
for (int i = 10; i > 0 ; i--){
System.out.println(ThreadName+"_"+ i);
}
}
@Test
public void testTicketThrea(){
TicketThead ticketThead = new TicketThead();
new Thread("线程1"){
@Override
public void run() {
String name = getName();
ticketThead.saleTicket(name);
}
}.start();
new Thread("线程2"){
@Override
public void run() {
ticketThead.saleTicket(getName());
}
}.start();
new Thread("线程3"){
@Override
public void run() {
ticketThead.saleTicket(getName());
}
}.start();
}
}
格式:synchronized(锁对象){
可能出现线程安全问题的代码(访问了共享数据的代码)
}
private int ticket = 100;
Object obj = new Object();
@Override
public void run() {
while (true) {
synchronized(obj){
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket--);
}
}
}
}
public void run() {
while (true) {
saleTicket();
}
}
private synchronized void saleTicket(){
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket--);
}
}
private static /*synchronized*/ void saleTicket(){
synchronized(Runnable.class){
if (ticket > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket--);
}
}
}
3. 锁机制
public void run() {
while (true) {
lock.lock();
if (ticket > 0) {
try {
Thread.sleep(10);
System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket--);
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
}
public static void main(String[] args) {
Object obj = new Object();
new Thread("顾客线程"){
@Override
public void run() {
synchronized (obj){
System.out.println(getName()+"告知老板要买的包子数量和种类!");
try {
obj.wait(); //释放了锁对象
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("开吃包子咯");
}
}
}.start();
new Thread("老板线程"){
@Override
public void run() {
synchronized (obj){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName()+"告知顾客包子做好了");
obj.notify();
}
}
}.start();
}
//线程一
public class BaoZiPu extends Thread{
private BaoZi bz;
public BaoZiPu(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
synchronized (bz){
if (bz.flag == true){
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (bz.flag == false){
bz.name = "叉烧包";
System.out.println(getName() + ":" + "开始生产"+bz.name+"包子");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("生产好了包子");
bz.flag = true;
bz.notify();
}
}
}
//线程二
public class Consumer extends Thread {
private BaoZi bz;
public Consumer(BaoZi bz) {
this.bz = bz;
}
@Override
public void run() {
synchronized (bz){
if (bz.flag == false){
try {
bz.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (bz.flag == true){
System.out.println( getName() + ":" + "开吃" + bz.name + "包子!");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("包子吃完了!");
bz.notify();
bz.flag = false;
}
}
}
}
//
BaoZi bz = new BaoZi();//传入的锁对象是同一个
new BaoZiPu(bz).start();
new Consumer(bz).start();
频繁的创建线程和销毁线程需要消耗时间
其实就是一个容纳多个线程的容器,线程池中的线程是可以反复使用的。
java.util.concurrent.Executors
static ExecutorService newFixedThreadPool(int nThreads) 创建一个线程池,使用固定数量的线程操作了共享***队列。
Future<?> submit(Runnable task) 提交执行一个Runnable任务并返回一个表示该任务的未来。
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(new RunnableThead());
感谢你看到这里,文章有什么不足还请指正,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!
java开发两年,连这些多线程知识都还没掌握,你凭什么涨薪!
标签:reads 继承 线程并发 行业 over 类对象 相关 如何 进程
原文地址:https://blog.51cto.com/14801695/2528585