sexta-feira, 28 de agosto de 2009

Metodologias de Sistemas, Objetos, Classes

Sumário: Metodologia de Sistemas,Objetos,Classes


- O fundamento é não so ensinar Orientação a Objetos mais também a Arquitetura de JAVA(aqui eu não vou impor nada, vou dizer da onde vem)
Importante intender que esses tutoriais se baseiam totalmente na Plataforma JAVA.
- Não considero um bom tutorial para se aprender, mais por curiosidade. Muitas coisas você pode até não saber como funciona, mais usa, mesmo porque muita gente usa a Lâmpada mais nem imagina como funciona a eletricidade certo?


Advertência: É necessária a leitura do(s) Post(s): Princípios Básicos: Voce Tem que saber e Teoria Geral dos Sistemas, Paradigmas conceituados!



Oque é uma Metodologia?

É um ciclo de vida no desenvolvimento do seu Programa. Programadores não setam e começam a desenvolver um programa ao invez disso, eles seguem um planejamento, um CICLO DE vida que é seguido.(Temos varios tipos de Metodologias, aqui darei exemplo de um TIPO).


Oque é escopo?
Domínio do problema * oque é que voce vai fazer* Qual o motivo daquilo


Qual será a Metodologia escolhida?

Eu realmente não tenho muito conhecimento sobre metodologias a fundo. De um modo geral resumi muitas as quais eu ja usei em uma muito simples(Desculpa se ja existe uma com essa ideia abreviada, ISSO não fui eu que inventei, é um RESUMO):


Clique na figura para ampliar

Especificações = Classes

Análise -> É a definição concreta do escopo(domínio- Oque é!!!-) do seu problema. Um programa é feito em cima de uma NECESSIDADE(Essa necessidade é determinada no ESCOPO do problema). É um processo da análise de todas as necessidades referentes ao problema.


Projeto(Design) - Pega-se todas as necessidades encontradas na etapa de Análise e cria-se ESPECIFICAÇÕES que tem como objeto resolver o domínio do problema.

Codificação(Desenvolvimento) - Todas as especificações criadas no estágio de Projeto agora se tornarão OBJETOS.

Testes - Assegura que, a Junção de objetos criados na CODIFICAÇÃO resolve o domínio do problema(as necessidades) que o processo de análise encontrou.


Implementação - Com o programa ja pronto, Existe a disponibilização para os Clientes.


Trabalharemos aqui da seção Projeto em diante, o processo de Análise é importante(Alias o mais) porem não faz parte do Intuito desse Tutorial:


Executar e Testar fazem parte da Fase de Testes


Oque é um programa em java?


Um Conjunto de Objetos.(Que juntos são capazes de RESOLVER ou dominio do problema(FASE DE ANÁLISE da Metodologia))

Oque é um Objeto?

É uma abstração de algo.Qualquer elemento capaz de ter COMPORTAMENTO e CARACTERÍSTICA.(Lembra-se de DADOS E FUNÇÃO do post Teoria Geral dos Sistemas, Paradigmas conceituados!? É a relaçao!!!) - Todo objeto tem duas coisas,ATRIBUTOS(CARACTERÍSTICAS) MÉTODOS (COMPORTAMENTO) - So precisa disso agora em mente, um OBJETO TEM 2 coisas.


Desenhando e aprendendo:




Isso é um objeto, clique na imagem para ampliar

Oque são Atributos?

São características do Objeto,O valor atribuido a um atributo é referenciado como o estado do objeto.
Vamos a um Exemplo:

- Um objeto TV, tem o Atributo - COR - sua tv tem uma cor certo?


Oque são Métodos?
São Comportamento. Vamos a um Exemplo:
- um objeto TV, tem o coportamento - Ligar - você pode ligar sua tv certo?


Desenhando e aprendendo:

Isso é um objetoTv Sem estado no atributo cor que sabe Ligar, clique na imagem para ampliar

Onde eu armazeno Atributos no Objeto?

Em Variaveis de Instancia - Por enquanto so saiba isso, Atributos estão nas variaveis de Instancia.(É pessimo o começo, cada hora eles dão um nome para um coisa, dão a volta ao mundo para não complicar, e COMPLICA MAIS AINDA). Variaveis Atributos guardam o ESTADO DO OBJETO.

Como eu crio objetos?
Na fase 2 Projeto(Design) - Temos o conceito de ESPECIFICAÇÃO, cria-se um MOLDE para que seus objetos sigam.Na biologia temos o conceito de classe exemplo: mamíferos, caninos etc(Ou seja todo OBJETO que tenha CARACTERISTA(Atributos em COMUM)). Então cria-se uma classe para dela se CRIAR um objeto.

Oque é uma classe?

É uma especificação. Com uma Classe você pode criar Objetos, a Classe é uma especificação para Objetos isso significa, que é como a JVM irá construir os seus Objetos.
A jvm pega essa Especificação(Classe) cria os seus objetos e preenche os atributos dos objetos(que vai representar o estado do objeto).

Onde moram os Objetos?

Isso é um nivel um pouco alto para quem esta aprendendo agora, porem eu acho muito melhor você aprender desenhando doque lendo,lendo,lendo,lendo e so lendo. Basicamente Objeto vivem na HEAP.Temos 2 áreas básicas que você tem que aprender, LOCAL VARIABLE E HEAP.(Local Variable e heap fazem parte da Arquitetura da JVM).

Desenhando e aprendendo:
Toda vez que for fazer algum Objeto, desenhe isso!!!


Processos em java:
Sabemos que um programa em execução vira processo. Todo processo tem ao menos uma thread(Não precisa estudar thread em java para saber isso!!!).


Desenhando e aprendendo:



Kernel é o gerenciador de Recursos e tarefas do S.O. so precisa saber isso. Ele que "controla".Clique na imagem para ampliar

Oque temos basicamente em uma thread?
Resumindo e somente para utilidade, toda thread tem uma STACK. Então todo processo tem ao menos uma thread, toda thread tem uma STACK.


Desenhando e aprendendo:

Clique na imagem para ampliar

Oque eu tenho dentro da Stack?

Toda Stack tem métodos. O método que será executado é aquele que esta no fim da STACK. O primeiro método que aprenderemos é o main. Se você não tiver o main, consequentemente não tem um método no fim da Stack, consequentemente não tem um programa que poderá ser PROCESSO.
Nesse exemplo sim, AGORA TEMOS UM PROGRAMA QUE PODE SER PROCESSO.

Clique na imagem para ampliar
Qual a relação Heap Local Variable e Stack?

Farei uma coisa ruim, porem farei. Todo Objeto mora em Heap, logo todo processo mesmo que não use, TEM HEAP. Todo processo tem ao menos uma thread, toda thread tem uma STACK. Toda Stack trabalha empilhando Métodos(Toda vez que um método é invocado(Chamado, O método ta na hora de trabalhar!!!), o método entra na STACK.E o método main é invocado automaticamente). Todo método tem uma área que se chama LOCAL VARIABLE.(Só precisa saber disso.)

O intuito é, mostrar oque é um objeto, oque é uma classe, oque é um PROCESSO e oque um PROCESSO EM JAVA PRECISA. No começo é meio confuso, mais Conforme o tempo te garanto que o entedimento doque esta fazendo, supera o de muita gente com experiência.


Erros de compilação:
Todos os erros de compilação são erros de Sintaxe e Semântica ou seja erros na estrutura da Classe.
Exemplo: faltando ; , faltando { } .

É hora da revisão:
- Todo processo tem ao menos uma thread(Não precisa saber de threads de java para saber isso)
- Toda thread tem uma Stack
- Toda Stack tem que ter um método que esta no fim dela, que é oque sera executado(Normalmente usamos o main)

- Local Variable,heap,Stack fazem parte da Arquitetura da JVM
- Classes são especificações para criação de objetos
- Variaveis Atributo dizem qual é o estado atual do objeto Próxima seção será mão na massa com tudo que vimos.
- Erros de Compilação são de Semântica e Sintaxe

CYA DUDES!


Tecnologia Java:

Sumário: A linguagem de programação, A plataforma,O ambiente de desenvolvimento,O ambiente de Implementação,Grupos da Tecnologia, JSR


Quando falamos em java, oque te surge a cabeça?
- A linguagem de programação
- A Plataforma independente - JVM
- O ambiente de desenvolvimento - javac, java, javap,javadoc,jar etc
- O ambiente de Implementação - SDK, JRE ou navegador web/


Minha idéia é não só, mostrar a linguagem em si, mais a PLATAFORMA Independente(JVM).



Oque é uma plataforma?
É a junção de um Sistema Operacional e Hardware, as mais conhecidas são windows,Unix, Solaris,Linux etc.(São conhecidas como plataformas nativas).



Oque é uma plataforma indepedente?
É a emulação de uma plataforma nativa, é uma plataforma de Software que roda em cima de uma Plataforma Nativa.


A Plataforma indepedente é dividida em 2 partes:
- Java Virtual Machine(JVM)
- Java Application Programming Interface(API's)




Clique na imagem para ampliar


Na maoria das linguagens de programação quando você compila um programa, você obtem um arquivo compilado e ligado com bibliotecas nativas da plataforma nativa(o compilador dessas linguagens ja é um LINK EDITOR que é quem faz essa ligação com bibliotecas nativas), quando você quer utilizar esse programa compilado para um plataforma nativa em outra, você tem que fazer novamente o programa(em muitos casos recompilar não funciona).

Clique na imagem para ampliar
Esse executável de Windows so funcionara em plataformas Nativas Windows

Plataforma dependente:
Com a compilação de seu algoritmo na linguagem de programação você obtem um programa ESPECIFICO da CPU.


Plataforma independente de java:
Com a compilação de seu algoritmo na linguagem de programação você obtem um programa em bytecode.

Programas de Plataforma dependente:
O tipo de compilador usado por essas plataformas converte seu programa em um código específico daquela CPU. O executavel como chamado nada mais é Doque a junção desse código específico daquela CPU + bibliotecas de código nativo, quem faz essa junção é o link Editor. Ou seja temos um binário daquela CPU mais código nativo.


Programas de Plataforma independente:
Programas na tecnologia java podem ser executado em qualquer combinação de CPU com Sistema Operacional. O compilador de java transforma seu programa em bytecode ao invéz de Código de CPU específico a uma Plataforma.
Como java não usa editor de links na compilação quando a JVM vai interpretar os bytecodes a JVM necessita das API's para entender as instruções específicas daquela Plataforma nativa.Ou seja existe a necessidade da JRE para a intepretação dos bytecodes.

Depois que eu obtive meu bytecode, quem executará ele?
Na verdade quem interpretará seu bytecode é a Máquina Virtual Java.
Java é considerado uma linguagem interpretada e portavel.

Oque é a máquina virtual java?
A Maquina virtual java é um programa específico da plataforma nativa que entende bytecodes de uma plataforma independente(ou seja, seja la o S.O. que compilou) a JVM consegue interpretar eles na plataforma nativa.


Clique na imagem para ampliar


Alem da Máquina Virtual, oque mais preciso para Executar um programa em java?
Alem da máquina virtual, você necessita de um conjunto(uma biblioteca) que são as API's de java. O conjunto JVM(Java virtual Machine) e API's é conhecido como JRE(Java Runtime Environment).


Oque são API's?
API é um coleção de "programas" prontos que fornecem ajuda no desenvolvimento.Muitas coisas você não precisará fazer, ja tem pronto em java.

A JRE é por plataforma nativa?
Sim a JRE é derivada de plataforma para plataforma nativa e é necessaria para fazer a interpretação de qualquer programa em java que você queira que vire processo.

Quais são as funções da JVM?
- Carregar Class Files(arquivo.class), Verificar código(para ver se ele atende a segurança de código previsto em java), Interpretar código.


Como é o nome do compilador de java?
javac

Oque são bytecodes?
Toda vez que você compila um programa em java, você cria um class File(arquivo.class) esse class File será interpretado pela JVM da JRE e causará em um processo na Plataforma nativa.

Se eu compilar esse exemplo:

public class Exemplo{


}


Vou obter isso em bytecode:

Compiled from "Exemplo.java"
public class Exemplo extends java.lang.Object{
public Exemplo();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()V
4: return


Oque eu preciso então para interpretar esse meu Programa.class?
Precisa fazer Download da JRE da sua Plataforma Nativa depois, abra o Terminal(DOS, VI) e digite:
java NomeDoSeuPrograma

java = Launcher java, é quem diz para a JVM que é hora de trabalhar


Oque eu preciso para Desenvolver um programa em java?
1 - Saber a linguagem
2 - Um bloco de notas
3 - O SDK


Oque é o SDK?
Software Development kit, A escolha é de Plataforma nativa para Plataforma Nativa.

Oque eu tenho incluso no SDK?
- JRE(JVM + API's)
- javac(compilador)
- Documentação das API's(download separado)
- Utilitários como: jar,javap,javadoc etc
- Exemplo de programas da tecnologia java


Como eu verifico os bytecodes do meu Class file?
1 - abra o terminal
2 - ache o caminho do arquivo, aonde ele esta.
3 - javap -c MeuPrograma

Quais são os grupos da Tecnologia java?
- SE - Standard Edition -Applets e Programas Desktop.Todo mundo começa por aqui, é padrão, Desktop ou Applet.
- EE - Enterprise Edition - Softwares empresariais, Normalmente são via internet,eCommerce, webShoppings, Paginas de Web etc
- ME - Micro Edition - São Softwares para Mobile(celular etc)

Cada Grupo da Tecnologia tem o seu SDK(que permite compilar, executar e criar programas em java)
Temos então:

Java SE SDK
Java SE SDK applet
Java EE SDK
Java ME SDK

Quais são os passos para Desenvolver um programa em java?
1 - Baixe do site da SUN o SDK do SE
2 - Instale o arquivo, abre o terminal(DOS,VI) e digite java - version, se aparecer algo dizendo a versão de java, estamo no caminho(Senão instale novamente)
3 - Abra o bloco de notas
4 - Escreva seu código em java
5 - Salve o seu código com NomeDaClasse.java
6 - Compile seu arquivo: javac NomeDaClasse.java
7 - Mande A JVM trabalhar: java NomeDaClasse


Applets:
- São programas escritos na linguagem de programação java que residem no Servidor Web, são baixados por um navegador no Sistema no cliente e são executados por esse navegador.
- Os Applets são chamados via uma página de web
- O navegador tem uma implementação própria da Jvm para executar os Applets.
-Foi a primeira utilização de java, que naquele tempo tinha outro nome "OAK" e foi uzado na implementação de aplicativos logo no inicio da Internet.
- Sâo iniciadas em um web browser


Gerenciamento automático de memória(coletor de lixo):

- Muitas linguagens de programação passam a responsabilidade de alocação e desalocação de memoria ao programador, Oque se for mal feito, gera problemas de memoria.(Ponteiros etc)
- Em java o coletor de lixo faz a desalocação de memória automática, oque quer dizer que você não precisa se preocupar com DESALOCAÇÃO de memória.

Oque é JSR?

Quando o primeiro grupo da criação da Linguagem java, chamado "Oak" estava no mercado, eles criaram uma proposta de projetos, que foi chamada Request for Programming(RFP), que futuramente se Tornaria a JSR(Java Specification Requests ) que são especificações criadas para a implementação da Tecnologia java, São tipo padrões. Quem controla isso é o :
http://jcp.org/en/home/index
Java Community Process o qual é um grupo formado por empresas e associados que visa a melhoria da Tecnologia java, discutindo e implementando melhorias dia por dia.
Para asseguar a portabilidade de seus programas em java, Toda JRE segue uma especificação, a mesma esta disponivel se alguem quiser criar sua própria JVM e compilador. Chama-se JSR.


Qual a versão de java?
Existe dois tipos de versões?
- Versão de desenvolvimento = 1.6
- Versão de Marketing = 6.0
Ambas são iguais, so depende da onde você usa.

Versões de java:
Java 1.02 -> 250 Classes, Applet era o Grande atrativo da linguagem
Java 1.1 -> 500 Classes, Se tornando Popular, melhor GUI
Java 2 -> 2300 Classes , Somente em 3 versões agora, SE, EE,ME
Java 5 -> 3500 Classes,Conhecido como Tiger

A mudança de 1.1 para 2 foi tão grande que não dava para seguir o ritmo de 1.2, 1.3 foi então que lançaram java 2 como se fosse um novo produto, Para quem não conhece é o ciclo conhecido como End-of-life(Eol) do Product Life Cycle(PLC).


Quais linguagens a JVM entende?
Não somente java, a JVM entende muitas outras linguagens, Pyton, Ruby etc(Se você pesquisar na Internet: Programming Languages for JVM, verá a quantidade)

Quem carrega Classes na JVM?
Existe um "programa" dentro da JVM que é quem carrega Classes em java, se CHAMA CLASS LOADER, ele so carrega sobre necessidade(ou seja ele so carrega sa que você utilizar).



Comsumer Device é sempre relevante a Clientes de dispositivos mobiles.

Garbage collector -> você não roda ele, você sugere que ele rode, a COleta de lixo ocorre automaticamente durante a vida de um programa java, porem , a coleta de lixo varia de implemtação da JVM para Implementação da JVM.


JVM -> Class Loader = alem de fazer carregamento de classes tem mecanismos de segurança como um separador de classes locais e as da rede, isso impede vacalos de tróia pois, as classes locais são carregadas primeiro.



É hora da revisão:

- A tecnologia java não é somente a linguagem de programação
- A JVM é quem interpreta o seus Class Files
- Todo programa compilado em java se transforma em um Class File
- javac é o compilador de java
- java é o launcher de java
- javap -c é utilizado para ver os bytecodes do seu Class File
- Existem 3 grupos em java(SE, EE,ME)
- Para programar em java, você precisa do SDK
- Para interpretar programas em java, você precisa da JRE
- a JRE é a junção de JVM + API's

Bom por hoje é só!!!
CYA DUDES

quinta-feira, 27 de agosto de 2009

Teoria Geral dos Sistemas, Paradigmas conceituados, Estrutural x Orientação a objetos

Conceito Chave sobre a linguagem de programação java:
Advertência: É necessária a leitura do(s) Post(s): Princípios Básicos: Voce Tem que saber!



*Orientada a Objetos:
A linguagem programação java é Orientada a Objetos(Paradigma Orientado a objetos) o principal objetivo da linguagem é a criação de objetos,Pequenos pedaços de código que juntos formam a solução de um problema. Poucos sabem porem O Padradigma Orientado a objetos começou com a linguagem SIMULA-67(Sabe porque se chamala SIMULA? Pois com O.O ela fazia a Simulação da vida REAL), Porem a primeira que realmente entrou no Paradigma foi Smalltalk.

A partir de hoje, você aprenderá não só java, mais a desenhar. Quando dizemos que java é uma linguagem do paradigma Orientado a objetos, estamos dizendo que um CONJUNTO DE OBJETOS FORMAM um programa(Veja isso como um quebra cabeça, onde você pega peça por peça). ISSO é um objeto:


Clique na imagem se quiser ampliar

E isso é um Programa feito no Paradigma Orientado a Objetos:




Clique na imagem se quiser ampliar


Curiosidade:
Orientação a Objetos deriva da BIOLOGIA, de uma forma abstrata tudo é formado por moléculas sistematicamente falando no paradigma Orientação a Objetos tudo é um objeto(componente) o qual a idéia é muito parecida com a de molécula.

- Uma molécula interage com outras através de mensagems
- Quando uma molécula quer afetar outra, dispara um sinal químico que obtem a resposta desejada
- A membrana da cécula receptora filtra as mensagens, atende as que realmente fazem sentido fazendo funções internas.(Isso evita que uma célula precise conhecer oque a outra faz)

Então um conjunto de células forma um corpo físico, um conjunto de Objetos formam um programa.(Da biologia vem conceitos como Herança,Polimorfismo veremos mais sobre isso nas próximas seções.).


Teoria Geral dos Sistemas:
Daqui que surge a idéia de Orientação a Objetos

A Teoria Geral dos Sistemas foi elaborada, em 1937, por Ludwig Von Bertalanffy, para preencher uma lacuna na pesquisa e na teoria da Biologia. Os seus primeiros enunciados são de 1925 e ela é amplamente reconhecida na administração da década de 60.
Da definição de Bertalanffy , segundo a qual o sistema é um conjunto de unidades reciprocamente relacionadas , decorrem dois conceitos : o de propósito ( ou objeto ) e o de globalismo ( ou totalidade ) . Esses dois conceitos retratam duas características básicas em um sistema .

*** O conceito de elementos(Componentes) é o mesmo de OBJETOS EM JAVA

Um sistema é :

- Um conjunto de elementos
- Dinamicamente relacionados
- Formando uma atividade
- Para atingir um objetivo
- Operando sobre dados / energia / matéria
- Para fornecer informação / energia / matéria

O nivel de Abstração de um Sistema é importante:
As moléculas existem dentro das células , as células dentro dos tecidos , os tecidos dentro dos órgãos , os órgãos dentro dos organismos , os organismos dentro de colônias , as colônias dentro de culturas nutrientes , as culturas nutrientes dentro de conjuntos maiores de culturas , e assim por diante .

- Um Sistema pode ser Formado de moléculas(Olhando por um nivel mais baixo de abstração)
- Um Sistema pode ser Formado por células(Subindo um pouco mais o nivel de abstração)
- Um Sistema pode ser Formado por tecidos(Subindo ainda mais um pouco o nivel de abstração)

BIBLIOGRAFIA

Além das já citadas no trabalho: www.sbdg.org.br
Grupo de Formação 90 - SBDG

BERTALANFFY, L.v. - Teoria Geral dos Sistemas, Vozes, Petropólis , 1972
BERTALANFFY, L.v. - Teoria Geral dos Sistemas, Vozes, Petropólis , 1972

Qual a diferença entre Paradigma Orientado a Objetos(java) e o Paradigma estrutural?

A Orientação a Objetos e Estruturada, são paradigmas totalmente diferentes.



1 - Estrutural trata um programa como um Conjunto de instruções, Orientação a Objetos trata um programa como um Conjuntos de Objetos que interagem entre si(Assim como a derivação da Teoria Geral dos Sistemas):



Clique na imagem se quiser ampliar

Orientação a Objetos:


Clique na imagem se quiser ampliar





2 - I/O no dispositivo(Estrutural) X CRUD(Orientação a Objetos):


Conceitos Iniciais: O tempo de resposta do acesso a HD normalmente é de 10 elevado a -3(10 ^ -3), o tempo de resposta do acesso a RAM é de 10 elevado a -9(10 ^ -9).(Ou seja o acesso em Ram é muito mais rápido)

-> Linguagens com paradigma Estrutural trabalham com o conceito de I/O(Input/Output) no dispositivo.


Clique na imagem se quiser ampliar


*A conexão entre dispositivos é feito e permancida, ou seja conecta-se um dispositivo no outro e fica conectado direto.(A leitura dos dados fica conforme a necessida porem a conexão é mantida),(Programa em RAM e dados em disco), fica nesse trabalho de acessar um ao outro.

-> Linguagens com paradigma Orientado a Objetos entra com o conceito de CRUD(Create, Retrieve, Update e Delete)


Clique na imagem se quiser ampliar


* A conexão entre dispositivos só é feita na leitura de dados da HD, o programa todo(Programa e dados) trabalha em memória RAM, onde o tempo de resposta é bem menor.



3 - Decomposição da Visão dos Paradigmas:


Estrutural -> Começa em um nivel de Abstração de MACRO -> MICRO
Essencial -> Começa em um nivel de Abstração Intermediário.
Macro <- Intermediário -> Micro
Orientação a Objetos -> Começa em um nivel de Abstração MICRO, e o Conjunto de MICROS, formam um MACRO

Nasce o Conceito de Decomposição de Sistemas

4 - Geração:

Estrutural -> São linguagens de Terceira Geração
Orientação a Objetos -> São linguagens de Quarta Geração



5 - Conforme a distribuição do seu programa:

(Em estrutural temos o conceito de que um programa é dividido em duas partes: Dados e funções).

Conforme Observado no item 2, em linguagens estruturadas os dados estão em HD e as funções em RAM portanto:


Clique na imagem se quiser ampliar

Conforme Observado no item 2, em linguagens Orientadas a Objeto, o acesso a HD é muito baixo, pois todo programa se encontra em RAM portanto:


Clique na imagem se quiser ampliar


Essa diferença é explicita agora, EM Orientação a Objetos os dados e as funções em si ficam Juntos(RAM), ja em Estrutural os dados ficam em meios diferentes das funções em si(Como se fosse um programa dividido em 2 partes - RAM E HD).


6- Gerenciamento automático de memória:

Estrutural: Em linguagens Estruturais não tenho gerenciamento de memória, ou seja a alocação e desalocação de memória fica a encargo do programador. Em muitos casos acontece oque chamamos de memory link ou seja memória presa ao programa que não tem mais uso a ele e que não foi desalocada pela programador.
Orientado a objetos: Em java temos o Garbage Collector(GC) que é quem faz a desalocação automática de memória deixando a cargo da Arquitetura de java a desalocação de memória e não ao programador.



7- Ponteiros:
Estrutural: Temos o conceito de ponteiro a estrutura
Orientado a objetos: Temos o conceito de Referência ao objeto



É Fundamental Intender:

Paradigmas Diferentes não significa melhor e nem pior, TUDO depende da Implementação do código que você usará. É importante saber intender e principalmente valorizar as diferenças. Nada é Pior e nem melhor, apenas tem sua utilidade diferenciada.
Com o paradigma Orientado a Objetos surge o Conceito de componentização(ir em busca de um componente(objeto), fazer a junçar de componentes(objetos)) e surge um Conceito de que a maioria dos softwares hoje em dia são OBJETOS COMPUTACIONAIS.
Olhando um programa de uma forma abstrata, dividindo ele em 2 partes:
- Dados
- Funções
O paradigma estrutural trabalha com Dados em HD, Funções em RAM(Os dados e as funções são do programa todo). Orientação a objetos trabalha com dados e funções em RAM(Cada Objeto tem seus Dados e suas funções).
No paradigma Orientado a Objetos, Um programa é um conjunto de objetos, e cada Objeto não sabe e nem quer saber do outro. Abstraindo da vida real é como se fosse uma relação entre duas pessoas..Uma dia a outra: Eu nem sei e nem quero saber da sua vida, cada um com seus problemas.(Infelizmente na vida real nem sempre ocorre isso!)


Paradigma Orientado a Objetos e Abstrações do mundo real:

Antigamente tinha-se em mente o conceito de "Fabricantes de Automóveis" pois, a Fábrica fabricava carros. Se você observar hoje em dia temos o CONCEITO MONTADORA DE CARROS(Essas grandes empresas não fabricam carros elas montam, todas as peças(componentes,objetos) ja estão prontos), com o Conjuntos de objetos do carro(motor, roda etc) ja estão prontos, elas simplesmente MONTAM OS OBJETOS NO CARRO, sendo assim uma MONTADORA DE CARROS.


Importante saber diferenciar:
Implementar = Construir algo
Implantar = Colocar algo ja construido para FUNCIONAR


Esse post é só uma introdução entre as diferenças de Paradigmas, conceitos de Orientação de objetos ja introduzindo a linguagem de programação JAVA

CYA DUDES!!!

Entendendo Java Através de Desenhos e Arquitetura da JVM

O real Intuito dessa minha sequência de posts será Ensinar java mostrando na Arquitetura da JVM oque acontece, É importante seguir a sequência.

1 - Teoria Geral dos Sistemas, Paradigmas conceituados, Estrutural x Orientação a objetos

terça-feira, 25 de agosto de 2009

Entendendo Threads 03: Comunicação entre threads

Comunicação entre threads:

Sumario: yield(),wait(), notify(), notifyAll()


Método de comunicação entre escalonador threads e threads threads:


YIELD:

package: java.lang.Thread;

static void yield() - yield(cede) , Yield da uma chance para que outra thread de mesma prioridade que esta no estado RUNNABLE possa se tornar RUNNING. Se nenhuma outra thread de mesma prioridade (Porque de mesma prioridade? Porque se for de menor prioridade ela nem entrará mesmo, e se for de maior, com ou sem yield() ela entrara) estiver no pool de RUNNABLE, então nada acontecerá.


WAIT E NOTIFY:
package: java.lang.Object;

São métodos do OBJETO, que ajudarão na comunicação de threads.

- Principio básico sobre wait() e notify():

1 - thread A necessita de uma certa condição e assume que thread B fará para ela.

2 - Quando thread B termina a condição ela notifica thread A, porem, isso não quer dizer que thread A será a thread RUNNING, continuara com B.

- Eles são preservadores de recursos, Vamos a um exemplo:

***Supondo que temos um E-commerce porem temos somente 1 produto para vender no momento, o produto é tao bom que 400 consumidores querem o produto(mais so temos 1 em estoque) - Sendo produto 1 thread, e cada consumidor 1 thread(ou seja 400 threads). Faz mais sentido eu deixar 399 threads em CPU intensive( ou seja em um loop procurando por threads produto ate achar) ou simplesmente eu deixo todas as threads consumidores(399) em uma fila de espera chamada: Bloqueado em pool de espera do objeto, onde quando houver mais 1 thread produto eu notifico elas, consumindo mais uma da fila e assim por vez!!!!????


Abstraindo wait e notify x I/O intensive:

Conversa entre Pessoas:

Ja esteve no carro um dia com seu filho, e ele ficava perguntando:

- Pai ja chegou?
- Não!
e de novo ele pergunta
- Pai ja chegou?
e de novo você responde:
- Não!
e de novo ele pergunta
- Pai ja chegou?
e de novo você responde:
- Não!

e de novo ele pergunta
- Pai ja chegou?

e você fica bravo com tantas perguntas e diz, fica ESPERANDO que quando chegar eu te aviso!

*** Basicamente deixa a thread em um bloqueio de stack, porque tem uma frame(a frame referente ao wait()) que bloqueia o top da stack por um determinado tempo ou notificação que nem read(), readLine() fazem. - So que essa frame normalmente esta em um bloco sincronizado, então a frame bloqueada, é a anterior a ela por causa da necessidade de verificação do synchronized.

void wait() - Aguarda até que uma condição ocorra. Este é um método da classe Objeto e deve ser chamado DE DENTRO DE UM METODO OU BLOCO SINCRONIZADO.

void notify() - Notifica uma thread que estava esperando, de que a condição ja ocorreu(Somente notifica, deixando assim a thread que estava esperando a condição no ESTADO "BLOQUEIO EM POOL DE BLOQUEIO DE OBJETO", explicando, o método/bloco é synchronized e a thread que invocou notify() ja é a thread com a chave do objeto, então a outra é notificada mais fica no "BLOQUEIO EM POOL DE BLOQUEIO DE OBJETO" POIS ela não tem a chave do objeto. Este é um método da classe Objeto e deve ser chamado DE DENTRO DE UM METODO OU BLOCO SINCRONIZADO.

passo a passo da explicação acima:


thread A e B compartilham o mesmo Objeto:

- thread A invoca myObject.wait() entrando assim no estado "Bloqueado em pool de espera do objeto"
-
thread B esta no estado Running agora
-
thread B entra em um bloco SINCRONIZADO e invoca myObject.notify()

- thread A entra no estado "Bloqueado em pool de bloqueio de objeto"

- thread B sai do BLOCO SINCRONIZADO e Thread.sleep(100)

- thread B entra no estado Bloqueado

- thread A agora entra no estado Executável, existe a avaliação do Escalonador

- thread A agora entra em estado EM EXECUÇÃO


Qual é o proposito de wait e notify?

É um mecanismo sincronizado , cada objeto em java tem(Lembre-se que qualquer classe is a Object), POREM é um mecanismo de COMUNICAÇÃO. Deixa uma thread aguardando por uma condição, e outra avisa quando ocorrer.


Oque acontece com a thread na qual um objeto invoca wait() ?

Ela vai para um POOL, chamado "BLOQUEIO EM POOL DE ESPERA DO OBJETO", E so sai de la, Quando a Thread que invocou notify() for bloqueada ou sair do bloco SINCRONIZADO, ja que as 2 são do mesmo objeto e em blocos sincronizados o acesso ao bloco so pode ser dado a uma thread por vez.

Quem notify para o wait?

Claro o mesmo objeto que aguarda, será na outra stack(thread) uma referencia que notifica.(Se na Stack A, objeto1 invoca wait(), na Stack B o mesmo objeto1 deve ter uma referencia la para invocar notify()). LEMBRE-SE POREM O OBJETO tem que ser Runnable de ambas as threads, ou fazer referencia em ambas.


Que condição preciso ter para invocar wait ou notify?

O método ou bloco que invocar wait() ou notify() deve ser synchronized, para evitar o round-robin(claro e o timeSlicing).

Noque devo me atentar?

A invocação de notify() só tira uma thread do estado "BLOQUEIO EM POOL DE ESPERA DO OBJETO" porem , COMO A THREAD QUE invocou notify() esta em um bloco sincronizado do mesmo objeto, a thread que estava wait() vai para o estado "BLOQUEIO EM POOL DE BLOQUEIO DE OBJETO" por falta da chave para acesso...E é importante também ter cuidado ao usar SLEEP() etc, pois pode ocorrer da thread ir dormir com a chave...Então de preferencia a usar wait() e notify() em blocos sincronizados.


Alguma consideração a mais?

Alem de não invocar sleep() em blocos sincronizados(Pois a thread pode ir dormir com a chave) por isso prefira wait() e notify(), Use comandos de bloqueio como sleep() etc no código da thread que dará a chance a outra para entrar, POREM CLARO em blocos não sincronizados.


Quem realmente fica em wait()?

Como eles estão em bloco sincronizado, a instrução que invocou que fica, pois é necessária a verificação novamente, PORQUE uma thread que estava no "BLOQUEADO EM POOL DE ESPERA DO OBJETO" quando sai de la entra no estado "BLOQUEADO EM POOL DE BLOQUEIO DE OBJETO" a qual so sai de la quando, a thread que esta com a chave liberar.

Exemplo:

public void run(){

for(int i = 0; i<>

myJob.get();

}

}

Esse método run() é de uma thread e abaixo temos a implementação do método que é o RUNNABLE da thread(ou seja o Job dela).


public synchronized void get(){

if(!flag){

try {

wait();

} catch (InterruptedException ex) {

Logger.getLogger(MyJob.class.getName()).log(Level.SEVERE, null, ex);

}

}//end of if


System.out.println("Get: "+dados);

flag = false;


CASO A FLAG SEJA false logicamente entra no bloco if, e a instrução wait(); da o bloqueio em myJob.get() - (Claro a instrução wait() esta dentro do bloco if, porem o bloqueio é na invocação); o contador(pc do PC Register) esta sabendo certinho o valor de i...É como começar a invocação do ponto onde terminou.

- Pois bem a thread no wait() entrou em Bloqueado em pool de espera do objeto, quando o objeto em outra thread deu notify() essa thread foi para Bloqueado em pool de bloqueio de objeto(Pois a chave do cadeado do objeto estava com a outra thread.). Quando a outra thread saiu do bloco/método sincronizado a chave foi liberada e daí sim a outra thread que estava bloqueada pode entrar na instrução.


Oque é flag?

Flag é como se fosse um demarcador, ex:

boolean test = true;


while(test)

{

i++;

Faz a demarcação, É como se fosse um verificador periódico; Ou apenas um teste de se CASO OCORRA.


NOTIFYALL -

Simplesmente notifica todas as threads que estão no Bloqueado em pool de espera do objeto" REFERENTES AQUELE OBJETO.. Muito cuidado ao usar. Lembre-se também que deve ser invocado de dentro de um método/bloco sincronizado.

Dicas:


- static void yield() - yield(cede) , Yield da uma chance para que outra thread de mesma prioridade que esta no estado RUNNABLE possa se tornar RUNNING.


- Agora temos os estados:

Clique na Imagem para maximizar


* Novo - Quando você instancia um objeto thread

* Executável - start() em um novo objeto thread ou quando volta da maioria dos estados

* Bloqueado - Thread.sleep()

* Bloqueado em pool de bloqueio de objeto - quando uma thread tenta entrar em um método/bloco sincronizado porem outra thread ja esta usando(ou seja fecho o acesso) então não temos a chave, ela fica nesse estado

* Bloqueado em pool de espera do objeto - Quando é dado wait() em um objeto a thread fica nesse estado

* Inativo - Dead é quando a thread terminou o code_block de run() seja normalmente ou prematuramente

* Em execução - É a thread que esta sendo executada(Usando A CPU) no real momento.


- wait() - Object.wait() Faz com que uma thread fique no estado - Bloqueado em pool de espera do objeto - Aguardando pela chamada de notify() do mesmo objeto...Object.notify().

- notify() - Tira uma thread do estado - Bloqueado em pool de espera do objeto -e faz com que ela fique no estado - * Bloqueado em pool de bloqueio de objeto - Pois o método/bloco é sincronizado e a thread que invocou notify() ainda esta nométodo/bloco fazendo com que a outra fique em aguardo no novo estado.

- De preferência a uso de flags em seu código.

- Ao usar métodos/blocos sincronizados de preferência a invocação de wait() e notify() ja que invocações como sleep() podem causar danos como: Uma thread ir dormir com a chave do OBJETO e outra thread quer acessar o método/bloco porem não pode. Então cuidado ao usar Thread.sleep() em contexto sincronizado.

- Para evitar possíveis problemas de obtenção e liberação das chaves dos cadeados dos Objetos, Libere as chaves na ordem Inversa na qual você obteve.

- Sempre divida tarefas em threads, melhora o uso da CPU e a distribuição do trabalho.

- Alguns métodos como read(), readLine() etc, deixam a Stack da thread atual noque chamamos de I/O intensive, a Stack fica realmente parada esperando alguma I/O.


PARA UTILITÁRIOS SOBRE THREAD, BUSQUE INFORMAÇÕES NO PACOTE

java.util.concurrent; -> inclusive existem classes que facilitam a criação de threads e inclusive o manuseio.



Sincronização:

Sincronização:

* O principio desse capitulo é falar sobre o acesso de múltiplas threads ao mesmo OBJETO, ou seja, 2 chamadas de métodos/instruções em 2 stacks diferentes porem os métodos/instruções são do mesmo objeto.

- QUANDO OCORRE TIMESLICING EM THREADS QUE NÃO ACESSAM OS MESMOS OBJETOS, O PC DO PC REGISTER GARANTE QUE TODAS AS INTRUÇÕES SERÃO FEITAS. NO CASO DE 2 THREADS COM TIMESLICING NO MESMO OBJETO, o pc do PC register garante que todas instruções serão feitas, porem o problema é em qual instrução estamos.

Podemos considera-lá como um átomo, não pode ser dividida.


Descrevendo uma situação provável:


Uma objeto chamado Object, que contem um método chamado somar e outro chamado subtrair, a thread A deve invocar somar e a thread B deve invocar subtrair, porem ambas elas estão FAZENDO NO MESMO OBJETO...Lembre-se muitas vezes o escalonador não tem uma ordem certa com threads de mesma prioridade, Portanto mesmo que você faça primeiro

ThreadA.somar();

ThreadB.subtrair();

Pode ser que ocorra isso: Um timeSlicing de threads, vamos ver:


public int x = 5;

Thread A - Prioridade 5 - Incremente o valor em 5,acessando o método do objeto que praticamente faz isso:

x = x + 5;


Thread B - Prioridade 5 - Decrementa o valor em 5, acessando o método do objeto que praticamente faz isso:

x = x - 5;


Object - as Duas Threads tem o mesmo objeto como RUNNABLE


getfield #2; = Instance variable que é uma referencia dinâmica a constant Pool da classe, que sera resolvida depois...Ou seja instance variable do Objeto



VAMOS VER OQUE ACONTECERÁ:


*Thread A - usa uma parte do TimeSlicing dela, invocando somar() no Object


getfield #2

iconst_5

iadd <----

putfield #2

Quando o pc do pc register da method area estava na instrução iconst_5 <-, o tempo se esgotou da THREAD A, portanto é hora da THREAD B.(Lembre-se que o <--- mudou porque quando o pc do Pc register faz uma instrução ele salva o estado e guarda o endereço da próxima instrução)


A Operand STACK referente a Thread A esta:

5

5


---------x-----------

*Thread B - usa uma parte do TimeSlicing dela, invocando subtrair() no Object(Mesmo Objeto que A)


getfield #2

iconst_5

isub <----

putfield #2

O pc do pc register da method area estava na instrução iconst_5 <-, o tempo se esgotou da THREAD B, portanto é hora da THREAD A.(Lembre-se que o <--- mudou porque quando o pc do Pc register faz uma instrução ele salva o estado e guarda o endereço da próxima instrução)


A Operand STACK ESTA


5

5

----------x----------

*Thread A - usa uma parte do TimeSlicing dela, invocando somar() no Object


getfield #2

iconst_5

iadd

putfield #2


-------->Termino da Frame.


A Operand STACK ESTA - sem nada agora, x = 10 agora.


--------x----------


*Thread B -usa uma parte do TimeSlicing dela, invocando subtrair() no Object(Mesmo Objeto que A)

Repare que, o valor de x é 10, não é mais 5, porem a atualização não acontece aqui, pois a instrução de carregar o valor(getfield #2) foi feita antes da instrução de adicionar(iadd (x = x + 5)) da THREAD A


getfield #2

iconst_5

isub

putfield #2


A Operand STACK esta vazia agora, x = 0; porem deveria ser 5, mais eu sobrescrevi o valor. (E não era essa a intenção)


Conseguiu enxergar a inconsistência de valores? eu simplesmente tinha uma instance variable, com o valor de 5

public int x = 5;


Oque era para acontecer:


Em uma thread eu gostaria de somar + 5...

x = x + 5,

x = 5 + 5;

x = 10;-> Thread A


Em uma outra thread eu gostaria de subtrair 5...

x = x - 5;

x = 10 - 5;

x = 5; - Thread B


Oque aconteceu: x = 0;

No final meu x foi para 0(e era para ser 5), houve uma inconsistência de valores, devido ao fato que temos 2 stacks acessando o mesmo OBJETO supondo que ocorra timeSlicing oque é muito provável e obviou que elas tem a mesma prioridade.


Foi como dito antes, certas coisas são como átomos, não podemos dividir.



Como consertar isso?

Bom sabemos que Garantia de haver ou não Robin-Round(claro e o timeSlicing)não podemos ter, Portanto fazemos o seguinte:

TODO objeto em java tem um cadeado, ESSE CADEADO É DO OBJETO logo esse cadeado pode estar trancado ou destrancado. Só que esse mecanismo só fica ativo quando usamos a keyword synchronized.


Quando um cadeado esta trancado?

Quando uma thread acessa um membo synchronized, ou uma instrução synchronized, A thread se tranca em um "quarto" com o objeto, e diz que só devolve a chave do quarto, QUANDO ELA TERMINAR O SERVIÇO.


E se uma threadB quer usar o Objeto, porem a threadA esta com a chave?

A thread B fica em um Pool CHAMADO: Blocked in Object’s Lock Pool. E so sai de la quando a thread A, sair do quarto e devolver a chave.

SIMPLESMENTE synchronized evita o Robin-Round(claro e o timeSlicing) referente aquele objeto, evita usando o mecanismo de tranca onde a thread fica com a chave,outras threads ate podem acessar o método, so que ficam no Object’s Lock Pool esperando a outra thread sair do "quarto" e devolver a chave.



EXEMPLO DE Método de somar e subtrair synchronized:


Object = é um objeto com uma instance variable (public int x = 5) e 2 métodos sicronizados(somar(), subtrair())


Thread A = é a Thread de SOMA

Thread B = é a thread de subtração



*Thread A entra invoca somar() do objeto Object


getfield #2

iconst_5

iadd <----

putfield #2

Na instrução iconst_5, terminou o time da thread A, portanto time da Thread B


*Thread B tentar entra invocar subtrair do objeto Object, POREM Não pode, pois não tem a chave para destrancar(Pois subtrair é SINCRONIZADO). PORTANTO THREAD B entra no POOL das Blocked in Object’s Lock Pool.


*Thread A volta da onde tinha parado, e continua o somar() do Object


getfield #2

iconst_5

iadd

putfield #2


agora sim, x = x + 5...x = 10; Thread A terminou o bloco de código do frame , abriu "o quarto" e devolveu a chave.


*Thread B tentar entra invocar subtrair do objeto Object, COMO thread A terminou la esta a chave, B PEGA A CHAVE, se tranca com o objeto "no quarto"e manda a ver no metodo!


getfield #2

iconst_5

isub

putfield #2


AGORA TEMOS O RESULTADO QUE QUERIAMOS, x = 5



TENHO que synchronized o método todo?

Não você pode simplesmente synchronized o código que você quer, especificando um objeto que tem a chave para aquilo.(Eles te dão a chance de ter um bloco onde se consegue garantir o termino coerentemente e onde você pode especificar outro objeto para a obtenção da tranca disso)


public void go(){

synchronized(this){


}


}


Ou declare uma instance variables somente para armazenar a Tranca dele


Object d = new Object();


synchronized(d){



}


Resumo:


- Quando duas threads acessam o mesmo objeto tenha CUIDADO, potenciais problemas podem vir a ocorrer.

- TODO OBJETO TEM UM CADEADO ASSOCIADO COM ELE.

- O cadeado e a chave dele, estão associados ao objeto … A thread simplesmente tranca ele e pega a chave, porem devolve ao OBJETO DEPOIS. Portanto 2 métodos synchronized significa só uma chave para acessar qualquer um dos dois.

- Lembre-se só sincroniza - se membros, e construtor não é considerado membro

- Quando uma thread acessa um membro synchronized do objeto, outras threads não poderão acessar SOMENTE MEMBROS synchronized DESSE OBJETO, ATE QUE A PRIMEIRA THREAD DESTRANQUE...REPITO SOMENTE MEMBROS synchronized QUE ELES NÃO PODERÃO ACESSAR.


- Thread safe é estar synchronized.

- O grande problema de não fazer membros thread safe não é a questão de timeslicing mais sim das intruções que já podem ter sido feitas pelo pc do pc Register.

- Podemos fazer métodos (thread safe) ou code_blocks (thread safe), porem em questão de code_blocks é necessário especificar o objeto.

- Se for um membro static, a thread tranca os membros synchronized da classe, e só devolve a chave para a classe quando terminar.

- Quando uma thread A acessa o método/instrução sincronizada de um objeto, e thread B tenta acessar o um método/instrução sincronizada do mesmo objeto, SE thread A ainda não terminou, thread B vai para o estado “Bloqueado em pool de Bloqueio de Objeto” e so sai de la quando a devolver a chave do objeto.

Passo a passo:


1 - thread A entra em um método/instrução sincronizada do objeto1

2 - thread B tenta entrar em algum método/instrução sincronizada do objeto1(mesmo de thread A)

3 -thread B encontra um objeto1 fechado para métodos/instruções sincronizadas e não encontra a chave, thread B vai para o estado: “Bloqueado em pool de bloqueio de objeto”

4 - thread A termina o code_block(ou vai dormir em uma instrução não sincronizada) e libera a chave do objeto1

5 - thread B agora vai para o estado Executável e como só temos essa thread de maior prioridade o escalonador seleciona thread B para ser RUNNING.


Fácil sincronização neh?

CYA DUDES!!!